这种操作在新的 斯维夫特 语法中是那般的

1.收回过去的接口

  谈起 GCD, 大家明确回看起好像 dispatch_async 那样的语法。 GCD
的这一个语法形式无论是和 Objc 依旧 斯维夫特 的完整风格都不太打掉。 所以 Swift3 中对它的语法进行了绝望的改写。

例如说最常用的,在四个异步队列中读取数据, 然后再再次回到主线程更新 UI,
这种操作在新的 斯维夫特 语法中是如此的:

1 DispatchQueue.global().async {
2  
3   DispatchQueue.main.async {
4    
5   self.label?.text = "finished"
6    
7   } 
8    
9 }

 

变化相当的大, 首先 Swift 3 丢掉了 GCD 从前的函数式调用格局。 引进了
DispatchQueue 这几个类, 第一行的 DispatchQueue.global().async

相当于选取全局队列实行异步操作。然后在调用 DispatchQueue.main.async

行使主线程更新相应的 UI 内容。

任由从代码长度,已经语法含义上都一览明白了有个别吧。 其余, 此番对 GCD
的精耕细作还包含预先级的概念。 未来大家利用 Global Queue 的时候,能够运用
DISPATCH_QUEUE_PRIORITY_这种操作在新的 斯维夫特 语法中是那般的。DEFAULT 或
DISPATCH_QUEUE_这种操作在新的 斯维夫特 语法中是那般的。PRIORITY_这种操作在新的 斯维夫特 语法中是那般的。BACKGROUND 等,来钦点队列的事先级。 而新的
GCD 引进了 QoS (Quality of Service)
的定义,浮以后代码上面就是优先级所对应的称号变了, 对应涉及如下:

1 DISPATCH_QUEUE_PRIORITY_HIGH:  .userInitiated
2  
3 DISPATCH_QUEUE_PRIORITY_DEFAULT:  .default
4  
5 DISPATCH_QUEUE_PRIORITY_LOW: .utility
6  
7 DISPATCH_QUEUE_PRIORITY_BACKGROUND: .background

这种操作在新的 斯维夫特 语法中是那般的。这种操作在新的 斯维夫特 语法中是那般的。举个例证,假设想以万丈优先级实践那些行列, 那么就足以那样:

1 DispatchQueue.global(qos: .userInitiated).async {
2  
3  }

 

这种操作在新的 斯维夫特 语法中是那般的。 

2. DispatchWorkItem

  除了直接使用 Global Queue, 还足以定义 DispatchWorkItem。
DispatchWorkItem 定义了八个操作的里边代码,以及优先级,天性等等。
它能够一贯在其他队列中推行:

1 let queue = DispatchQueue(label: "swift.queue")
2  
3 let workItem = DispatchWorkItem(qos: .userInitiated, flags: .assignCurrentContext) {
4  
5   }
6    
7 queue.async(execute: workItem)

那样的 GCD,看起来更为吻合面向对象的作风了。

dispatch_time_t

再有叁个是对 dispatch_time_t 的改进:

1 let delay = DispatchTime.now() + .seconds(60)
2 DispatchQueue.main.after(when: delay) {
3  // Do something
4 }

语法使用起来更为简明。DispatchTime.now() 是前段时间事先, 然后增长.seconds(60) 代表 60秒。 再利用 DispatchQueue.main.after 让这么些操作在 60
秒后进行。 相比于事先的 GCD 语法,那就轻松精晓非常多了。

顺手儿把 GCD 在此此前获得当前时间的语法贴出来相比较一下:

let dispatch_time = dispatch_time(DISPATCH_TIME_NOW, Int64(60 * NSEC_PER_SEC))

 

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图