一.簡(jiǎn)單介紹
1.什么是GCD?
全稱(chēng)是Grand Central Dispatch,可意為:"極其重要的中樞調(diào)度器";
純C語(yǔ)言,提供了非常強(qiáng)大的函數(shù).
2.GCD的優(yōu)勢(shì)
2.1GCD是蘋(píng)果公司為多核并行運(yùn)算提出的解決方案.
2.2GCD會(huì)自動(dòng)的利用更多的CPU內(nèi)核(比如雙核.四核).
2.3GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程.調(diào)度任務(wù),銷(xiāo)毀線程).
2.4程序員只需要告訴GCD想要執(zhí)行什么任務(wù);不需要編寫(xiě)任何線程管理代碼.
3.提示:
3.1GCD存在于libdispatch.dylib這個(gè)庫(kù)中,這個(gè)調(diào)度庫(kù)包含了GCD的所有東西,但任何iOS程序默認(rèn)就加載了這個(gè)庫(kù),在程序運(yùn)行中會(huì)動(dòng)態(tài)加載這個(gè)庫(kù),不需要我們手動(dòng)導(dǎo)入.
3.2GCD是純C語(yǔ)言的,因此我們?cè)诰帉?xiě)GCD相關(guān)代碼的時(shí)候,面對(duì)的是函數(shù),而不是方法.
3.3GCD中的函數(shù)大多數(shù)都是以Dispatch開(kāi)頭.
二.任務(wù)和隊(duì)列
GCD有二個(gè)核心概念:
(1) 任務(wù):執(zhí)行什么操作
(2)隊(duì)列 : 用來(lái)存放任務(wù)的;
GCD使用就是二個(gè)步驟 :
1.定制任務(wù);
2.確定想做的事情;
將任務(wù)添加到隊(duì)列中,GCD會(huì)自動(dòng)將隊(duì)列中的任務(wù)取出來(lái),放到響應(yīng)的線程去執(zhí)行
提示:任務(wù)的取出遵循FIFO 先進(jìn)先出 后進(jìn)后出.
三.執(zhí)行任務(wù)
1.GCD中有二個(gè)用來(lái)執(zhí)行任務(wù)的函數(shù):
(1)用同步的方式執(zhí)行任務(wù):Dispatch_sycn(dispatch_queue_t queue, dispatch_block_t block);
參數(shù)說(shuō)明:
queue:隊(duì)列;
block:任務(wù):
(2)用異步的方式執(zhí)行任務(wù) dispatch_asycn(dispatch_queue_t queue, dispatch_block_t block);
2.同步和異步的區(qū)別
同步:在當(dāng)前線程中執(zhí)行任務(wù)
異步:在另一條線程中執(zhí)行任務(wù)
四.隊(duì)列
1.隊(duì)列的類(lèi)型
GCD的隊(duì)列可以分為2大類(lèi)型
(1).并發(fā)隊(duì)列(Concurrent Dispatch Queue)
可以讓多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行(自動(dòng)開(kāi)啟多個(gè)線程同時(shí)執(zhí)行任務(wù))并發(fā)功能只能在異步(Dispatch_asycn)函數(shù)才有效.
(2),串行隊(duì)列(Serial Dispatch Queue)
讓任務(wù)一個(gè)接著一個(gè)地執(zhí)行(一個(gè)任務(wù)執(zhí)行完畢之后,在執(zhí)行下一個(gè)任務(wù));
2.補(bǔ)充
有四個(gè)術(shù)語(yǔ)容易混淆:同步 異步 并發(fā) 串行
同步:在當(dāng)前線程中執(zhí)行任務(wù),不具備開(kāi)啟線程的能力.
異步:在新的線程中執(zhí)行任務(wù),具備開(kāi)啟線程的能力.
并發(fā)和串行決定了任務(wù)的執(zhí)行方式:
并發(fā):多個(gè)任務(wù)并發(fā)(同時(shí)執(zhí)行);
串行:一個(gè)任務(wù)執(zhí)行完畢后,在執(zhí)行下一個(gè)任務(wù);
3.串行隊(duì)列
GCD中獲得串行隊(duì)列有倆種途徑
(1)使用Dispatch_queue_create函數(shù)創(chuàng)建串行隊(duì)列
dispatch_queue_t dispatch_queue_creat(const char *label, dispatch_queue_attr_t attr);//隊(duì)列名稱(chēng),隊(duì)列屬性,一般用NULL即可;
示例:
dispatch_queue_t = dispatch_queue_creat("wendinging", NULL);//創(chuàng)建
dispatch_release(queue);..非ARC需要釋放手動(dòng)釋放創(chuàng)建的隊(duì)列;
(2)使用主隊(duì)列(跟主線程相關(guān)的隊(duì)列)
主隊(duì)列是GCD自帶的一種特殊的串行隊(duì)列,放在主隊(duì)列的任務(wù)中,都會(huì)放到主線程去執(zhí)行.
使用dispatch_get_main_queue()獲得主隊(duì)列
示例:dispatch_queue_t queue = dispatch_get_main_queue();
4.并發(fā)隊(duì)列
GCD默認(rèn)已經(jīng)提供了全局的并發(fā)隊(duì)列,供整個(gè)應(yīng)用使用,不需要手動(dòng)創(chuàng)建;
使用dispatch_get_global_queue獲得全局并發(fā)隊(duì)列
dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags);//此函數(shù)暫時(shí)不用,用0即可;
示例:
這個(gè)參數(shù)是留給以后用的,暫時(shí)用不上,傳個(gè)0;
第一個(gè)參數(shù)為優(yōu)先級(jí),這里選擇默認(rèn)的.獲取一個(gè)全局的默認(rèn)優(yōu)先級(jí)的并發(fā)隊(duì)列.
dispatch_queue_t queue = dispatch_get_global_queue(DIAPATCH_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)
小結(jié):
同步函數(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)啟一條線程;
最后補(bǔ)充:
凡是函數(shù)中,各種函數(shù)名中帶有creat/copy/new/retain等字眼,都需要在不需要使用這個(gè)數(shù)據(jù)的時(shí)候進(jìn)行release.
GCD的數(shù)據(jù)類(lèi)型在ARC的環(huán)境下不需要在做release.
CF(core Foundation)的數(shù)據(jù)類(lèi)型在ARC環(huán)境下還是需要做release.
異步函數(shù)具備開(kāi)啟線程的能力,但不一定會(huì)開(kāi)線程;
如果有什么不對(duì)的地方,希望大家指正,十分感謝!