作家
登录

Swift多线程:GCD进阶,单例、信号量、任务组

作者: 来源: 2018-03-13 15:11:35 阅读 我要评论

看一下打印结不雅:

Swift多线程:GCD进阶,单例、旌旗灯号量、义务组

globalQueue 如不雅不加旌旗灯号量,正常打印是什么样子的?如不雅不记得,请看上一篇文┞仿。iOS多线程系列之三:应用GCD实现异步下载图片。

  • 好奇宝宝们有没有想过,在创建旌旗灯号量的时刻初始值设置成2或者更大年夜的数,例如50,会是什么效不雅? 本身敲敲代码尝尝喽,想想看。

4.2 多个线程之间进行义务调和

实际工作中,很多时刻我们须要在多个义务之间进行调和,每个义务都是多线程的。

打个比方,我们在后台下载音乐、专辑的封面。等着两个都做完了,才通知用户可以去听音乐了。两个义务都是多线程,我们其实并不知道什么时刻才能履行完毕。这个时刻,就可以靠旌旗灯号量,让大年夜家互相等待。

为了更简化这个过程,例子琅绫擎模仿了一个在别的一个办法中须要耗时1秒的一个操作。当完成之后,才履行后续操作。

  1. func semaphoreDemo() -> Void { 
  2.     let sema = DispatchSemaphore.init(value: 0) 
  3.     getListData { (result) in 
  4.         if result == true { 
  5.             sema.signal() 
  6.         } 
  7.     } 
  8.     sema.wait() 
  9.     print("我终于可以开端干活了"
  10.  
  11. private func getListData(isFinish:@escaping (Bool) -> ()) { 
  12.      
  13.     DispatchQueue.global().async { 
  14.         Thread.sleep(forTimeInterval: 1) 
  15.         print("global queue has completed!"
  16.         isFinish(true
  17.     } 
  18.      
  • 这个例子不是用group也可以做嘛?!是哒。也可以。

5. 义务组

既然是组,琅绫擎就肯定有很多队列啦,不然怎么能叫做“组”呐。

队列和组接洽关系有两种方法:手动、主动。

应用义务组可以完成很多场景的工作。例如多义务履行完后,同一刷新UI。把刷新UI的操作放在notify琅绫擎就好了。

5.1 主动接洽关系

肯定先大年夜主动开端了,因为平日主动最省事啊。这还用问嘛。

  1. @IBAction func useGroupQueue(_ sender: UIButton) { 
  2.     let group = DispatchGroup() 
  3.     //模仿轮回建立几个全局队列 
  4.     for index in 0...3 { 
  5.  
  6. //创建队列的同时,参加到义务组中         
  7. DispatchQueue.global().async(groupgroupexecute: DispatchWorkItem.init(block: { 
  8.             Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1)) 
  9.             print("义务\(index)履行完毕"

      推荐阅读

      全球工作大数据:中国的工作效率高位列全球第四

    沙龙晃荡 | 3月31日 京东、微博拭魅战专家与你合营商量容器技巧实践! 近日,Priceonomics网站应用Redbooth的数据,梳理统计出以前三年,40个国度所有行业的临盆和义务完成情况。结不雅显示>>>详细阅读


    本文标题:Swift多线程:GCD进阶,单例、信号量、任务组

    地址:http://www.17bianji.com/lsqh/40679.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)