DispatchQueue
首先,dispatch 的全局函數(shù)不再寫為下劃線風(fēng)格的名稱了,它變成了一個(gè)更符合 Swift 風(fēng)格的 DispatchQueue 的樣子。
main thread
同樣的,你不需要在去用dispatch_get_main_queue()來獲取主線程,而是DispatchQueue.main,那么要放到主線程的代碼怎么執(zhí)行呢?只需要在線程后邊使用.async{}即可,也就是說,大概是這樣:
DispatchQueue.main.async { [weakself]inyourcoderunsin mainthread}
而實(shí)際上,現(xiàn)在的 Xcode 的自動(dòng)補(bǔ)全,是錯(cuò)誤的.asynchronously()。
另:在目前的所有測試中,我發(fā)現(xiàn)所有寫在這個(gè)閉包里的代碼都不會(huì)被執(zhí)行——求幫助求解答,如果這是個(gè)bug……我的所有項(xiàng)目還是繼續(xù)使用 Swift 2.3 好了。
優(yōu)先級(jí)
說完了最基本的東西,我們再來說說其他改變了的東西,比如優(yōu)先級(jí)的名字。
我們知道,GCD 的默認(rèn)隊(duì)列優(yōu)先級(jí)有四個(gè):
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
現(xiàn)在,新的語法當(dāng)中,改變了這四個(gè)不明不白的優(yōu)先級(jí)名稱為更有意義的名字:
.userInitialted
.default
.utility
.background
當(dāng)然,它們的對(duì)應(yīng)關(guān)系也就是與順序相同的:
DISPATCH_QUEUE_PRIORITY_HIGH:????????.userInitiatedDISPATCH_QUEUE_PRIORITY_DEFAULT:??????.defaultDISPATCH_QUEUE_PRIORITY_LOW:??????????.utilityDISPATCH_QUEUE_PRIORITY_BACKGROUND:??.background
獲取一個(gè)隊(duì)列
我們使用DispatchQueue.global()獲取一個(gè)系統(tǒng)的隊(duì)列,這樣的話獲取的就是默認(rèn).default優(yōu)先級(jí)的隊(duì)列了,如果要獲取其他優(yōu)先級(jí)的隊(duì)列,就使用DispatchQueue.global(qos:.userInitiated),最后,我們使用.async{}來執(zhí)行代碼:
DispatchQueue.global(qos: .userInitiated).async{//your code here}
創(chuàng)建一個(gè)隊(duì)列
直接用DispatchQueue的初始化器來創(chuàng)建一個(gè)隊(duì)列。最簡單直接的辦法是這樣:
let queue = DispatchQueue(label:"myBackgroundQueue")
復(fù)雜一點(diǎn)?你可以指定優(yōu)先級(jí)以及隊(duì)列類別:
letqueue = DispatchQueue(label:"myBackgroundQueue", qos:.userInitiated, attributes:.concurrent)
然后把代碼放進(jìn)去即可:
queue.async{print("aaa")}
隊(duì)列打組
對(duì)于組,現(xiàn)在你可以使用這樣的語法直接創(chuàng)建一個(gè)組:
letgroup= DispatchGroup()
至于使用,則是這樣的:
letgroup= DispatchGroup()letqueue = DispatchQueue(label:"myBackgroundQueue")?queue.async(group:group) {????print("background working")}
那么,如果有多個(gè)并發(fā)隊(duì)列在同一個(gè)組里,我們需要它們完成了再繼續(xù)呢?
group.wait()
指定時(shí)間后執(zhí)行
很多時(shí)候你可能還需要讓一些代碼在指定的時(shí)間后執(zhí)行,比如動(dòng)畫完成后。這個(gè)任務(wù)在swift 2.3 很麻煩,不過,在3.0就不一樣了:
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() +3.0) {print("after!")}