澳门至尊网站-首页

您的位置:澳门至尊网站 > 软件综合 > GCD(斯维夫特)

GCD(斯维夫特)

2019-11-07 18:00

1.撤回过去的接口

废除过去的接口

  说到 GCD, 我们一定回想起像样 dispatch_async 那样的语法。 GCD 的这一个语法形式无论是和 Objc 依然 Swift 的完整风格都不太打掉。 所以 Swift3 中对它的语法举行了干净的改写。

聊到 GCD, 大家自然回顾起好像 dispatch_async 那样的语法,那一个语法在swift3中不再适用了,透顶重写了接口比如最常用的,在多个异步队列中读取数据, 然后再回到主线程更新 UI, 这种操作在新的 Swift 语法中是这么的:

举例最常用的,在二个异步队列中读取数据, 然后再回去主线程更新 UI, 这种操作在新的 斯威夫特 语法中是那般的:

DispatchQueue.global().async { DispatchQueue.main.async { self.label?.text = "finished" } }
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) 的定义,体今后代码下面正是优先级所对应的名目变了, 对应提到如下:

变化超级大, 首先 Swift 3 舍弃了 GCD 早先的函数式调用形式。 引进了 DispatchQueue 这么些类, 第豆蔻年华行的 DispatchQueue.global().async

* DISPATCH_QUEUE_PRIORITY_HIGH: .userInitiated * DISPATCH_QUEUE_PRIORITY_DEFAULT: .default * DISPATCH_QUEUE_PRIORITY_LOW: .utility * DISPATCH_QUEUE_PRIORITY_BACKGROUND: .background

约等于选拔全局队列举行异步操作。然后在调用 DispatchQueue.main.async

风流倜傥经想以万丈优先级试行那几个队列, 那么就足以那样:

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

DispatchQueue.global(qos: .userInitiated).async { }

甭管从代码长度,已经语法含义上都如数家珍了豆蔻梢头部分啊。 其它, 此次对 GCD 的精雕细琢还包蕴预先级的定义。 现在我们使用 Global Queue 的时候,能够应用 DISPATCH_QUEUE_PRIORITY_DEFAULT 或 DISPATCH_QUEUE_PRIORITY_BACKGROUND 等,来钦命队列的早期级。 而新的 GCD 引进了 QoS (Quality of Service) 的概念,体以后代码下面正是优先级所对应的名号变了, 对应提到如下:

DispatchWorkItem

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

除去直接利用 Global Queue, 还足以定义 DispatchWorkItem。 DispatchWorkItem 定义了叁个操作的里边代码,以至优先级,性情等等。 它能够一直在别的队列中实行:

举个例证,假使想以万丈优先级执行那么些行列, 那么就足以那样:

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

dispatch_time_t

 

再有多个是对 dispatch_time_t 的改进:

 

let delay = DispatchTime.now() + .secondsDispatchQueue.main.after(when: delay) { // Do something}

2. DispatchWorkItem

语法使用起来更为简约。DispatchTime.now() 是日前此前, 然后增进 .seconds 代表 60秒。 再接纳 DispatchQueue.main.after 让那些操作在 60 秒后进行。在此之前的语法是这些样子:

  除了直接行使 Global Queue, 还足以定义 DispatchWorkItem。 DispatchWorkItem 定义了一个操作的此中代码,以至优先级,性情等等。 它能够一贯在其他队列中实行:

let dispatch_time = dispatch_time(DISPATCH_TIME_NOW, Int64(60 * NSEC_PER_SEC))
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))

 

本文由澳门至尊网站发布于软件综合,转载请注明出处:GCD(斯维夫特)

关键词:

  • 上一篇:没有了
  • 下一篇:没有了