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()瑞侮。
另:在目前的所有測(cè)試中的圆,我發(fā)現(xiàn)所有寫在這個(gè)閉包里的代碼都不會(huì)被執(zhí)行——求幫助求解答,如果這是個(gè)bug……我的所有項(xiàng)目還是繼續(xù)使用 Swift 2.3 好了区岗。
優(yōu)先級(jí)
說完了最基本的東西略板,我們?cè)賮碚f說其他改變了的東西毁枯,比如優(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ì)列。最簡(jiǎn)單直接的辦法是這樣:
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!")}