GCD 在 Swift 3 中的玩兒法

QuinnCreech 8年前發布 | 5K 次閱讀 Swift Apple Swift開發

GCD 是 iOS 多線程開發一個重要的概念, 平常開發中大部分處理多線程的操作我們多少都會用到它。 Swift 3 對于 GCD 的使用接口做了一些改進, 就來聊聊吧。

取消過去的接口

說起 GCD, 大家肯定回想起類似 dispatch_async 這樣的語法。 GCD 的這個語法模式無論是和 Objc 還是 Swift 的整體風格都不太打掉。 所以 Swift 3 中對它的語法進行了徹底的改寫。

比如最常用的,在一個異步隊列中讀取數據, 然后再返回主線程更新 UI, 這種操作在新的 Swift 語法中是這樣的:

DispatchQueue.global().async {
  DispatchQueue.main.async {
  self.label?.text = "finished"
  } 
}

變化很大, 首先 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) 的概念,體現在代碼上面就是優先級所對應的名稱變了, 對應關系如下:

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

舉個例子,如果想以最高優先級執行這個隊列, 那么就可以這樣:

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

所以這個優先級概念的變化, 大家也需要留意一下。

DispatchWorkItem

除了直接使用 Global Queue, 還可以定義 DispatchWorkItem。 DispatchWorkItem 定義了一個操作的內部代碼,以及優先級,特性等等。 它可以直接在任何隊列中執行:

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

這樣的 GCD,看起來更加符合面向對象的風格了。

dispatch_time_t

還有一個是對 dispatch_time_t 的改進:

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

語法使用起來更加簡單。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 語法, 我大概看了一眼,就能明白它是什么意思了。 而下面這個老的語法,如果不查閱相關文檔的話,第一眼恐怕沒那么容易看懂了。

結尾

Swift 3 對 GCD 的語法改進還是很大的。 新的語法結構還是很不錯的, 當然大多數朋友應該都習慣了以前的寫法,也包括我~ 所以肯定需要一點時間適應。 希望這篇文章能幫你節省查閱文檔的時間, 在閑暇時刻了解一些技術點。

 

 

來自:http://www.jianshu.com/p/497318518171

 

 本文由用戶 QuinnCreech 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!