作家
登录

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

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

沙龙晃荡 | 3月31日 京东、微博拭魅战专家与你合营商量容器技巧实践!


其拭魅这个标题不知道怎么写了,都很碎,也没有想到特别合适的例子可以或许全部放在一路的。索性就这么平铺开吧。

1. dispatch_once,以及Swift下的单例

  1. //创建一个旌旗灯号量,初始值为1 
  2. let semaphoreSignal = DispatchSemaphore(value: 1) 
  3.  
  4. //表示旌旗灯号量-1 
  5. semaphoreSignal.wait()   
  6.  
  7. //表示旌旗灯号量+1 
  8. semaphoreSignal.signal()   

应用dispatch_once函数能包管某段代码在法度榜样运行过程中只被履行1次。所以在平日在OC时代,我们都邑用它来写单例。

旌旗灯号量这个器械在之前的文┞仿琅绫擎有一个例子琅绫擎用到了,当时还有人专门问我semaphore是什么器械。如今可以好好说一嗣魅这个了。

dispatch_apply函数是用来轮回来履行队列中的义务的。在Swift 3.0琅绫擎对这个做了一些优化,应用以下办法:

然则,然则,然则:这个函数在Swift3.0今后的时代已经被删除了。没错,被删除了,不消了。

凸(艹皿艹 ),那Swift琅绫擎的单例怎貌源渑?其实办法有很多种,有OC心Swift皮的写法、新瓶装老酒的写法,那既然咱们开端了Swift,就抛下以前那写沉重包袱吧。这里非典范技巧宅只分享个中的一种。

  1. final class SingleTon: NSObject { 
  2.     static let shared = SingleTon() 
  3.     private override init() {} 

什么?你在搞工作吧,就这么点?是的,因为是全局变量,所以只会创建一次。

  • 应用final,将这个单例类终止持续。
  • 设置初始化办法为私有,避免外部对象经由过程拜访init办法创建单例类的实例。

2. dispatch_after

在GCD中我们应用dispatch_after()函数来延迟履行队列中的义务。精确的懂得是,比及指定的时光到了今后,才会开辟一个新的线程然后急速履行队列中的义务。

所以dispatch_after不会壅塞当前义务,并不是先把义务加到线程琅绫擎,等时光到了在履行。而是等时光了,才参加到线程中。

不过挂起是不会暂停正在履行的队列的哈,只能是挂起还没履行的队列。

我们应用两种时光格局来看看。

办法一:应用相对时光,DispatchTime

  1. @IBAction func delayProcessDispatchTime(_ sender: Any) { 
  2.     //dispatch_time用于计算相对时光,当设备睡眠时,dispatch_time也就跟着睡眠了. 
  3.     //Creates a `DispatchTime` relative to the system clock that ticks since boot. 
  4.     let time = DispatchTimeInterval.seconds(3) 
  5.     let delayTime: DispatchTime = DispatchTime.now() + time 
  6.     DispatchQueue.global().asyncAfter(deadline: delayTime) { 
  7.         Thread.current.name = "dispatch_time_Thread" 
  8.         print("Thread Name: \(String(describing: Thread.current.name))\n dispatch_time: Deplay \(time) seconds.\n"
  9.     } 

办法二:应用绝对时光,DispatchWallTime

本来自负年夜Swift 1.x开端Swift就已经开端用dispatch_one机制在后台支撑线程安然的全局lazy初始化和静态属性。static var背后已经在应用dispatch_once了,所以大年夜Swift 3开端,就干脆把dispatch_once显式的撤消了。

  1. @IBAction func delayProcessDispatchWallTime(_ sender: Any) { 
  2.     //dispatch_walltime用于计算绝对时光。 
  3.     let delaytimeInterval = 
     1/5    1 2 3 4 5 下一页 尾页

      推荐阅读

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

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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