沙龙晃荡 | 3月31日 京东、微博拭魅战专家与你合营商量容器技巧实践!
其拭魅这个标题不知道怎么写了,都很碎,也没有想到特别合适的例子可以或许全部放在一路的。索性就这么平铺开吧。
1. dispatch_once,以及Swift下的单例
- //创建一个旌旗灯号量,初始值为1
- let semaphoreSignal = DispatchSemaphore(value: 1)
- //表示旌旗灯号量-1
- semaphoreSignal.wait()
- //表示旌旗灯号量+1
- semaphoreSignal.signal()
应用dispatch_once函数能包管某段代码在法度榜样运行过程中只被履行1次。所以在平日在OC时代,我们都邑用它来写单例。
旌旗灯号量这个器械在之前的文┞仿琅绫擎有一个例子琅绫擎用到了,当时还有人专门问我semaphore是什么器械。如今可以好好说一嗣魅这个了。
dispatch_apply函数是用来轮回来履行队列中的义务的。在Swift 3.0琅绫擎对这个做了一些优化,应用以下办法:
然则,然则,然则:这个函数在Swift3.0今后的时代已经被删除了。没错,被删除了,不消了。
凸(艹皿艹 ),那Swift琅绫擎的单例怎貌源渑?其实办法有很多种,有OC心Swift皮的写法、新瓶装老酒的写法,那既然咱们开端了Swift,就抛下以前那写沉重包袱吧。这里非典范技巧宅只分享个中的一种。
- final class SingleTon: NSObject {
- static let shared = SingleTon()
- private override init() {}
- }
什么?你在搞工作吧,就这么点?是的,因为是全局变量,所以只会创建一次。
- 应用final,将这个单例类终止持续。
- 设置初始化办法为私有,避免外部对象经由过程拜访init办法创建单例类的实例。
2. dispatch_after
在GCD中我们应用dispatch_after()函数来延迟履行队列中的义务。精确的懂得是,比及指定的时光到了今后,才会开辟一个新的线程然后急速履行队列中的义务。
所以dispatch_after不会壅塞当前义务,并不是先把义务加到线程琅绫擎,等时光到了在履行。而是等时光了,才参加到线程中。
不过挂起是不会暂停正在履行的队列的哈,只能是挂起还没履行的队列。
我们应用两种时光格局来看看。
办法一:应用相对时光,DispatchTime
- @IBAction func delayProcessDispatchTime(_ sender: Any) {
- //dispatch_time用于计算相对时光,当设备睡眠时,dispatch_time也就跟着睡眠了.
- //Creates a `DispatchTime` relative to the system clock that ticks since boot.
- let time = DispatchTimeInterval.seconds(3)
- let delayTime: DispatchTime = DispatchTime.now() + time
- DispatchQueue.global().asyncAfter(deadline: delayTime) {
- Thread.current.name = "dispatch_time_Thread"
- print("Thread Name: \(String(describing: Thread.current.name))\n dispatch_time: Deplay \(time) seconds.\n")
- }
- }
办法二:应用绝对时光,DispatchWallTime
本来自负年夜Swift 1.x开端Swift就已经开端用dispatch_one机制在后台支撑线程安然的全局lazy初始化和静态属性。static var背后已经在应用dispatch_once了,所以大年夜Swift 3开端,就干脆把dispatch_once显式的撤消了。
- @IBAction func delayProcessDispatchWallTime(_ sender: Any) {
- //dispatch_walltime用于计算绝对时光。
- let delaytimeInterval =
推荐阅读
沙龙晃荡 | 3月31日 京东、微博拭魅战专家与你合营商量容器技巧实践! 近日,Priceonomics网站应用Redbooth的数据,梳理统计出以前三年,40个国度所有行业的临盆和义务完成情况。结不雅显示>>>详细阅读
本文标题:Swift多线程:GCD进阶,单例、信号量、任务组
地址:http://www.17bianji.com/lsqh/40679.html
1/2 1