• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iOS开发:Swift多线程GCD的使用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  除了上一篇文章说到到NSThread线程,还有一个GCD(Grand Central Dispath),是Apple新开发的一个解决多核编程的解决方案,充分的利用CPU资源,将所有的任务,放到一个任务队列进行调度。 GCD 默认提供了全局的并发队列,供整个应用使用,不需要创建。

  • 同步和异步的区别
    • dispatch_sync 同步:不具备开启线程的能力
    • dispatch_async 异步 :具备开启线程的能力
  •  任务的执行方式
    • 并发队列:多个任务同时执行,并发只能在一步函数下才执行异步“
    • 串行队列:让任务一个接一个的运行

注意:一般在实际开发中最常用的是 dispatch_async 。

下面介绍几种常用的队列使用

一:最最常用的全局并发队列:

      //获取全局并发队列
        let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        //将任务添加到队列中 并发执行
        dispatch_async(queue) { () -> Void in
            //doSomething...任务1
        }
        dispatch_async(queue) { () -> Void in
            //doSomething...任务2
        }
        dispatch_async(queue) { () -> Void in
            //doSomething...任务3
        }
        
        //暂停一个队列
        dispatch_suspend(queue)
        //继续队列
        dispatch_resume(queue)

 

二:串行队列,队列中的任务不会并发执行,会一个任务执行完成后再执行另外一个任务

 //创建串行队列
        let serialQueue = dispatch_queue_create("dispatch_queue_name", nil)
        //将任务添加到队列中 一个任务执行完成后再执行另一个任务
        dispatch_async(serialQueue) { () -> Void in
            //doSomething... 任务1
        }
        dispatch_async(serialQueue) { () -> Void in
            //doSomething... 任务2
        }
        dispatch_async(serialQueue) { () -> Void in
            //doSomething... 任务3
        }

 

三:GCD线程间的通信,通常用于子线程请求完数据,回到主线程更新UI

 //线程间通信
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
            // 在子线程做一些事情
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //在主线程更新UI...
            })
        }

 

四:线程延时执行

    //线程延时执行
        let second:Double = 3.0
        let dtime = dispatch_time(DISPATCH_TIME_NOW, Int64(second * Double(NSEC_PER_SEC)))
        
        //3s后回到主线程中执行任务
        dispatch_after(dtime, dispatch_get_main_queue()) { () -> Void in
            
        }
        //3s后会开启一个新的线程执行队列中的任务
        dispatch_after(dtime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
            
        }

 

五:一次性代码,顾名思义,在应用生命周期内,block里代码块只会执行一次。

      var once:dispatch_once_t = 0
        dispatch_once(&once, { () -> Void in
            //在应用生命周期内只执行一次
        })
      

 

六:队列组:将一些任务放进一个队列组,当所有任务执行完成后,会执行组的notify。

    /**********************************队列组******************************************/
        let group = dispatch_group_create()
        let groupQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
        dispatch_group_async(group, groupQueue){ () -> Void in
            //任务1
        }
        dispatch_group_async(group, groupQueue){ () -> Void in
            //任务2
        }
        dispatch_group_async(group, groupQueue){ () -> Void in
            //任务3
        }
        dispatch_group_notify(group, groupQueue) { () -> Void in
            // 会等任务1、任务2、任务3执行完毕后执行
        }

 

 

完!

 

 

 

 

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
认识Swift发布时间:2022-07-14
下一篇:
Swift游戏实战-跑酷熊猫07平台的移动发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap