iOS--GCD的那些事

1.GCD簡(jiǎn)單介紹

GCD全稱為"Grand Central Dispath" 純C語(yǔ)言,提供了非常強(qiáng)大的函數(shù)

2.GCD的好處

GCD是蘋(píng)果為多核的并行運(yùn)算提出的解決方案

GCD會(huì)自動(dòng)利用更多的CPU內(nèi)核

GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程,調(diào)度任務(wù),銷毀線程)

運(yùn)用GCD,程序員不需要編寫(xiě)任何線程管理代碼

GCD的函數(shù)大多數(shù)是以dispatch開(kāi)頭

3.任務(wù)和隊(duì)列

任務(wù):執(zhí)行什么操作

隊(duì)列:用來(lái)存放任務(wù)

GCD使用的步驟:定制任務(wù)、確定想做的事

將任務(wù)添加到隊(duì)列中,GCD會(huì)自動(dòng)將隊(duì)列中的任務(wù)取出,放到對(duì)應(yīng)的線程中執(zhí)行。任務(wù)的取出遵循隊(duì)列的FIFO原則:先進(jìn)先出

4.執(zhí)行任務(wù)

1.GCD中有2個(gè)用來(lái)執(zhí)行任務(wù)的函數(shù)

把右邊的函數(shù)(任務(wù))提交給左邊的參數(shù)(隊(duì)列)進(jìn)行執(zhí)行

(1)用同步的方式執(zhí)行任務(wù)dispatch_sync(dispatch_queue_t queue,dispatch_block_t block);

參數(shù)說(shuō)明:queue 隊(duì)列;block 任務(wù)

(2)用異步的方式執(zhí)行任務(wù) dispatch_async(dispatch_queue_t queue,dispatch_block_t block);

2.同步和異步的區(qū)別

同步:在當(dāng)前線程中執(zhí)行

異步:在另一條線程中執(zhí)行

3.隊(duì)列

并發(fā)隊(duì)列:可以讓多個(gè)任務(wù)同時(shí)執(zhí)行,只能在異步函數(shù)下才有效

串行隊(duì)列:讓任務(wù)一個(gè)接著一個(gè)的執(zhí)行(一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù))

5.串行隊(duì)列

GCD獲取串行有2種途徑

(1)使用dispatch_queue_create函數(shù)創(chuàng)建串行隊(duì)列

dispatch_queue_t dispatch_queue_create(const char *label,dispatch_queue_attr_t attr)隊(duì)列名稱,隊(duì)列屬性,一般用NULL即可

示例:

dispatch_queue_t queue = dispatch_queue_create(@"guozhenwei",NULL);創(chuàng)建

(2)使用主隊(duì)列(和主線程相關(guān)聯(lián)的隊(duì)列)

主隊(duì)列是GCD自帶的一種特殊的串行隊(duì)列,放在主隊(duì)列中的任務(wù),都會(huì)放倒主線程中執(zhí)行

使用dispatch_get_main_queue()獲得主隊(duì)列

示例:

dispatch_queue_t queue = dispatch_get_main_queue();

6.并發(fā)隊(duì)列

GCD默認(rèn)已經(jīng)提供了全局的并發(fā)隊(duì)列,供整個(gè)應(yīng)用使用,不需要手動(dòng)創(chuàng)建

使用dispatch_get_global_queue函數(shù)獲得全局的并發(fā)隊(duì)列

dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags);//此參數(shù)暫時(shí)無(wú)用,用0即可

示例:

這個(gè)參數(shù)是留給以后用的,暫時(shí)用不上,傳0;

第一個(gè)參數(shù)為優(yōu)先級(jí),這里為默認(rèn)的。獲取一個(gè)全局的默認(rèn)優(yōu)先級(jí)的并發(fā)隊(duì)列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATHCH_QUEUE_PRIORITY_dEFAULT,0);獲得全局并發(fā)隊(duì)列

說(shuō)明:全局并發(fā)隊(duì)列的優(yōu)先級(jí)

define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高

define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默認(rèn)(中)

define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低

define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后臺(tái)

7.各種隊(duì)列之間的關(guān)系:

各種隊(duì)列之間的關(guān)系

8.示例代碼:

(1)用異步函數(shù)往并發(fā)隊(duì)列中添加任務(wù) ,


并發(fā)隊(duì)列

(2)使用異步函數(shù)的串行隊(duì)列 只會(huì)開(kāi)啟一個(gè)線程

串行隊(duì)列

33)小結(jié)

說(shuō)明:同步函數(shù)不具備開(kāi)啟線程的能力,無(wú)論是什么隊(duì)列都不會(huì)開(kāi)啟線程;異步函數(shù)具備開(kāi)啟線程的能力,開(kāi)啟幾條線程由隊(duì)列決定(串行隊(duì)列只會(huì)開(kāi)啟一條新的線程,并發(fā)隊(duì)列會(huì)開(kāi)啟多條線程)。

同步函數(shù)

(1)并發(fā)隊(duì)列:不會(huì)開(kāi)線程

(2)串行隊(duì)列:不會(huì)開(kāi)線程

異步函數(shù)

(1)并發(fā)隊(duì)列:能開(kāi)啟N條線程

(2)串行隊(duì)列:開(kāi)啟1條線程

補(bǔ)充:

凡是函數(shù)中,各種函數(shù)名中帶有create\copy\new\retain等字眼,都需要在不需要使用這個(gè)數(shù)據(jù)的時(shí)候進(jìn)行release。
GCD的數(shù)據(jù)類型在ARC的環(huán)境下不需要再做release。
CF(core Foundation)的數(shù)據(jù)類型在ARC環(huán)境下還是需要做release。
異步函數(shù)具備開(kāi)線程的能力,但不一定會(huì)開(kāi)線程

//原因 dispatch_sync 是同步線程執(zhí)行代碼 要阻塞當(dāng)前線程,如果當(dāng)前線程是主線程,首先被阻塞,然后執(zhí)行2輸出,問(wèn)題是代碼的參數(shù)是dispatch_get_main_queue() 它會(huì)獲取主線程然后在主線程執(zhí)行 2輸出 主線程本來(lái)就被阻塞 所以造成了互鎖。

NSLog(@"1");

dispatch_sync(dispatch_get_main_queue() , ^{

    NSLog(@"2");

});

NSLog(@"3");
最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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