什么是GCD
Grand Central Dispatch(GCD)是蘋(píng)果開(kāi)發(fā)的一個(gè)多核編程的解決方法。該方法在 MacOSX10.6(雪豹)中首次推出,并隨后被引入到了 iOS4.0 中蹦疑。 GCD 和起其他的多線程技術(shù)方案,如NSthread、NSOperationQueue、NSInvocationOperation 等技術(shù)相比,使用起來(lái)更加方便。
GCD的優(yōu)勢(shì)
- GCD是蘋(píng)果公司為多核的并行運(yùn)算提出的解決方案
- 會(huì)自動(dòng)利用更多的CPU內(nèi)存
- 會(huì)自動(dòng)管理線程的生命周期
- 程序員只需要告訴GCD想要執(zhí)行什么任務(wù)罪治,不需要編寫(xiě)任何線程管理代碼
GCD的兩個(gè)核心概念
- 任務(wù):執(zhí)行什么操作
- 隊(duì)列:用來(lái)存放任務(wù)
GCD的使用步驟
- 定制任務(wù)
- 將任務(wù)添加到隊(duì)列中
GCD的使用
GCD中有兩個(gè)用來(lái)執(zhí)行任務(wù)的常用函數(shù)
用同步的方式執(zhí)行任務(wù)
只能在當(dāng)前線程中執(zhí)行任務(wù),不具備開(kāi)啟新線程的能力
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
用異步的方式執(zhí)行任務(wù)
可以在新的線程中執(zhí)行任務(wù)礁蔗,具備開(kāi)啟新的線程的能力
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
GCD中還有個(gè)用來(lái)執(zhí)行任務(wù)的函數(shù):
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
在前面的任務(wù)執(zhí)行結(jié)束后它才執(zhí)行觉义,而且它后面的任務(wù)等它執(zhí)行完成之后才會(huì)執(zhí)行
GCD的隊(duì)列類(lèi)型
并發(fā)隊(duì)列類(lèi)型(Concurrent Dispatch Queue)
- 可以讓多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行(自動(dòng)開(kāi)啟多個(gè)線程同時(shí)執(zhí)行任務(wù))
- 并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效
使用dispatch_queue_create函數(shù)創(chuàng)建隊(duì)列
dispatch_queue_t dispatch_queue_create(const char *label, //隊(duì)列名稱
dispatch_queue_attr_t attr);//隊(duì)列的類(lèi)型
創(chuàng)建并發(fā)隊(duì)列
dispatch_queue_t queue = dispatch_queue_create("com.abc.queue", DISPATCH_QUEUE_CONCURRENT);
GCD默認(rèn)提供了全局的并發(fā)隊(duì)列,供整個(gè)應(yīng)用使用浴井,無(wú)需手動(dòng)創(chuàng)建
使用 dispatch_get_global_queue 函數(shù)獲得全局的并發(fā)隊(duì)列
dispatch_queue_t dispatch_get_global_queue(
dispatch_queue_priority_t priority, // 隊(duì)列的優(yōu)先級(jí)
unsigned long flags); // 此參數(shù)暫時(shí)無(wú)用晒骇,用0即可
獲得全局并發(fā)隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
全局并發(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)
串行隊(duì)列(Serial Dispatch Queue)
讓任務(wù)一個(gè)接著一個(gè)地執(zhí)行(一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù))
- 使用dispatch_queue_create函數(shù)創(chuàng)建串行隊(duì)列
//創(chuàng)建串行隊(duì)列(隊(duì)列類(lèi)型傳遞NULL或者DISPATCH_QUEUE_SERIAL)
dispatch_queue_t queue = dispatch_queue_create("com.abc.queue", NULL);
- 使用主隊(duì)列
- 主隊(duì)列是GCD自帶的一種特殊的串行隊(duì)列
- 放在主隊(duì)列中的任務(wù),都會(huì)放到主線程中執(zhí)行
- 使用dispatch_get_main_queue()獲得主隊(duì)列
dispatch_queue_t queue = dispatch_get_main_queue();