Swift 3 記錄GCD

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!")}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容