GCD理解

Dispatch Queues的生成可以有這幾種方式:

1.?dispatch_queue_t?queue?=?dispatch_queue_create("serial",?DISPATCH_QUEUE_SERIAL);//生成一個(gè)串行隊(duì)列,隊(duì)列中的block按照先進(jìn)先出(FIFO)的順序去執(zhí)行,實(shí)際上為單線程執(zhí)行。第一個(gè)參數(shù)是隊(duì)列的名稱,在調(diào)試程序時(shí)會(huì)非常有用,所有盡量不要重名了。

2.?dispatch_queue_t?queue?=?dispatch_queue_create("concurrent",?DISPATCH_QUEUE_CONCURRENT);//生成一個(gè)并發(fā)執(zhí)行隊(duì)列,block被分發(fā)到多個(gè)線程去執(zhí)行

3.?dispatch_queue_t?queue?=?dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);//獲得程序進(jìn)程缺省產(chǎn)生的并發(fā)隊(duì)列,可設(shè)定優(yōu)先級(jí)來(lái)選擇高、中、低三個(gè)優(yōu)先級(jí)隊(duì)列。由于是系統(tǒng)默認(rèn)生成的,所以無(wú)法調(diào)用dispatch_resume()和dispatch_suspend()來(lái)控制執(zhí)行繼續(xù)或中斷。需要注意的是,三個(gè)隊(duì)列不代表三個(gè)線程,可能會(huì)有更多的線程。并發(fā)隊(duì)列可以根據(jù)實(shí)際情況來(lái)自動(dòng)產(chǎn)生合理的線程數(shù),也可理解為dispatch隊(duì)列實(shí)現(xiàn)了一個(gè)線程池的管理,對(duì)于程序邏輯是透明的。

官網(wǎng)文檔解釋說(shuō)共有三個(gè)并發(fā)隊(duì)列,但實(shí)際還有一個(gè)更低優(yōu)先級(jí)的隊(duì)列,設(shè)置優(yōu)先級(jí)為DISPATCH_QUEUE_PRIORITY_BACKGROUND。Xcode調(diào)試時(shí)可以觀察到正在使用的各個(gè)dispatch隊(duì)列。

4.?dispatch_queue_t?queue?=?dispatch_get_main_queue();//獲得主線程的dispatch隊(duì)列,實(shí)際是一個(gè)串行隊(duì)列。同樣無(wú)法控制主線程dispatch隊(duì)列的執(zhí)行繼續(xù)或中斷。


接下來(lái)我們可以使用dispatch_asyncdispatch_sync函數(shù)來(lái)加載需要運(yùn)行的block。

dispatch_async(queue,?^{

//block具體代碼

});//異步執(zhí)行block,函數(shù)立即返回

dispatch_sync(queue,?^{

//block具體代碼

});//同步執(zhí)行block,函數(shù)不返回,一直等到block執(zhí)行完畢。編譯器會(huì)根據(jù)實(shí)際情況優(yōu)化代碼,所以有時(shí)候你會(huì)發(fā)現(xiàn)block其實(shí)還在當(dāng)前線程上執(zhí)行,并沒(méi)用產(chǎn)生新線程。

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

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

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