GCD(斯威夫特卡塔尔

1.撤消过去的接口

注销过去的接口

  说到 GCD, 大家自然回顾起好像 dispatch_async 那样的语法。 GCD 的那几个语法格局无论是和 Objc 还是 Swift 的完整风格都不太打掉。 所以 斯维夫特3 中对它的语法实行了根本的改写。

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

比如最常用的,在一个异步队列中读取数据, 然后再回来主线程更新 UI, 这种操作在新的 Swift 语法中是那般的:

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卡塔尔的概念,体未来代码下边正是优先级所对应的名目变了, 对应涉及如下:

变化相当的大, 首先 斯维夫特 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卡塔尔(英语:State of Qatar)的定义,体以往代码下面正是优先级所对应的名号变了, 对应提到如下:

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(卡塔尔(英语:State of Qatar) 是现阶段事情未发生前, 然后增进 .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))

 

本文由星彩网app下载发布于计算机编程,转载请注明出处:GCD(斯威夫特卡塔尔

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。