Xcode中 8 正式版已經發佈,我要在第一時間遷移我的專案到 Swift 3 —— 畢竟這是趨勢。
在遷移的過程當中我遇到了很多問題——比如 Xcode 提供的自動遷移工具根本沒有用,在我等待了兩個多小時之後,我放棄了,選擇手動遷移——畢竟,Xcode 的自動校正也是很好用的。
然而——在遷移過程當中,Xcode 一直處在 「indexing」 中,功能也不怎麼全...... 可能是由於 Swift 3 在演進的過程當中進行了多次語法的修改,所以很多地方的語法都是來回地修改——最終的結果就是變成一個無法自動校正的錯誤。
好吧,最終還是得手動來修改,所以這裡來記錄一下最常用的 GCD 的更改內容。
DispatchQueue
首先,dispatch 的全域函數不再寫為底線風格的名稱了,它變成了一個更符合 Swift 風格的 DispatchQueue 的樣子。
main thread
同樣的,你不需要在去用 dispatch_get_main_queue() 來獲取主執行緒,而是 DispatchQueue.主要 ,那麼要放到主執行緒的代碼怎麼執行呢? 只需要線上程後邊使用 .async {} 即可,也就是說,大概是這樣:
1 2 3 |
DispatchQueue.main.async { [weak self] in your code runs in main thread } |
而實際上,現在的 Xcode 的自動補全,是錯誤的 .asynchronously() 。
另:在目前的所有測試中,我發現所有寫在這個閉包裡的代碼都不會被執行——求説明求解答,如果這是個bug...... 我的所有專案還是繼續使用 Swift 2.3 好了。。
優先級
說完了最基本的東西,我們再來說說其他改變了的東西,比如優先順序的名字。
我們知道,GCD 的預設佇列優先順序有四個:
- DISPATCH_QUEUE_PRIORITY_HIGH
- DISPATCH_QUEUE_PRIORITY_DEFAULT
- DISPATCH_QUEUE_PRIORITY_LOW
- DISPATCH_QUEUE_PRIORITY_BACKGROUND
現在,新的語法當中,改變了這四個不明不白的優先順序名稱為更有意義的名字:
- .userInitialted
- .默認
- .utility
- .background
當然,它們的對應關係也就是與順序相同的:
1 2 3 4 |
DISPATCH_QUEUE_PRIORITY_HIGH: .userInitiated DISPATCH_QUEUE_PRIORITY_DEFAULT: .default DISPATCH_QUEUE_PRIORITY_LOW: .utility DISPATCH_QUEUE_PRIORITY_BACKGROUND: .background |
獲取一個佇列
我們使用 DispatchQueue.global() 獲取一個系統的佇列,這樣的話獲取的就是預設 .默認 優先順序的佇列了,如果要獲取其他優先順序的佇列,就使用 DispatchQueue.global(qos: .userInitiated) ,最後,我們使用 .async {} 來執行代碼:
1 2 3 |
DispatchQueue.global(qos: .userInitiated).async { //your code here } |
創建一個佇列
直接用 DispatchQueue 的初始化器來創建一個佇列。最簡單直接的辦法是這樣:
1 |
let queue = DispatchQueue(label: "myBackgroundQueue") |
複雜一點? 你可以指定優先順序以及佇列類別:
1 |
let queue = DispatchQueue(label: "myBackgroundQueue", qos: .userInitiated, attributes: .concurrent) |
然後把代碼放進去即可:
1 2 3 |
queue.async { print("aaa") } |
佇列打組
對於組,現在你可以使用這樣的語法直接創建一個組:
1 |
let group = DispatchGroup() |
至於使用,則是這樣的:
1 2 3 4 5 6 7 |
let group = DispatchGroup() let queue = DispatchQueue(label: "myBackgroundQueue") queue.async(group:group) { print("background working") } |
那麼,如果有多個併發佇列在同一個組裡,我們需要它們完成了再繼續呢?
1 |
group.wait() |
指定時間後執行
很多時候你可能還需要讓一些代碼在指定的時間後執行,比如動畫完成後。這個任務在swift 2.3 很麻煩,不過,在3.0就不一樣了:
1 2 3 |
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3.0) { print("after!") } |
只需要一句話即可。
本文由 落格博客 原創撰寫:落格博客 » Swift 3 裡的 GCD
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/2040.html