1.1 GCD的核心思想 : 將任務(wù)添加到隊(duì)列
1.2 GCD的使用步驟 :
創(chuàng)建隊(duì)列 :
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
創(chuàng)建任務(wù) :
void(^task)() = ^{
NSLog(@"hello %@",[NSThread currentThread]);
};
將任務(wù)添加到隊(duì)列 :
dispatch_async(queue, task);
1.3 簡(jiǎn)寫(xiě)
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"GCDDemo3 %@",[NSThread currentThread]);
});
1.4 GCD的線程間的通信 (需要完全掌握)
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"假裝在努力下載... %@",[NSThread currentThread]);
// 下載結(jié)束之后,通知主線程刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"假裝在刷新UI... %@",[NSThread currentThread]);
});
});
2.隊(duì)列和任務(wù)
- 串行隊(duì)列 : 里面無(wú)論放什么任務(wù)(同/異步任務(wù)),一定是有序執(zhí)行,先進(jìn)先出;
// 參數(shù)1 : 隊(duì)列的標(biāo)示符
// 參數(shù)2 : 隊(duì)列的屬性.決定了隊(duì)列是串行的還是并行的.
dispatch_queue_t queue = dispatch_queue_create("zj", DISPATCH_QUEUE_SERIAL);
- 并發(fā)隊(duì)列 : "可以"同時(shí)調(diào)度多個(gè)任務(wù)同時(shí)執(zhí)行(任務(wù)必須是異步任務(wù))
// 參數(shù)1 : 隊(duì)列的標(biāo)示符
// 參數(shù)2 : 隊(duì)列的屬性.決定了隊(duì)列是串行的還是并行的.
dispatch_queue_t queue = dispatch_queue_create("zj", DISPATCH_QUEUE_CONCURRENT);
- 同步任務(wù) : 不開(kāi)新的線程,只在當(dāng)前線程執(zhí)行(如果當(dāng)前線程是子線程,同步任務(wù)就會(huì)在當(dāng)前的子線程執(zhí)行)
dispatch_sync(queue, ^{
NSLog(@"%d %@",i,[NSThread currentThread]);
});
- 異步任務(wù) : 會(huì)新開(kāi)執(zhí)行
dispatch_async(queue, ^{
NSLog(@"%d %@",i,[NSThread currentThread]);
});
GCD隊(duì)列和任務(wù)組合總結(jié)
同步和異步?jīng)Q定了要不要開(kāi)啟新的線程 (同步不開(kāi),異步開(kāi))
同步:在當(dāng)前線程中執(zhí)行任務(wù),不具備開(kāi)啟新線程的能力
異步:在新的線程中執(zhí)行任務(wù),具備開(kāi)啟新線程的能力
串行和并發(fā)決定了任務(wù)的執(zhí)行方式
串行:一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù)
并發(fā):多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行
當(dāng)任務(wù)是異步的時(shí)候,隊(duì)列決定了開(kāi)啟多少條線程
串行隊(duì)列 : 只開(kāi)一條
并發(fā)隊(duì)列 : 可以開(kāi)啟多條

3.主隊(duì)列
- 專門(mén)用來(lái)在主線程上調(diào)度任務(wù)的隊(duì)列.
- 不會(huì)開(kāi)啟新線程.
- 以先進(jìn)先出的方式,在主線程空閑時(shí)才會(huì)調(diào)度隊(duì)列中的任務(wù)在主線程執(zhí)行.
- 如果當(dāng)前主線程正在有任務(wù)執(zhí)行,那么無(wú)論主隊(duì)列中當(dāng)前被添加了什么任務(wù),都不會(huì)被調(diào)度.
dispatch_queue_t queue = dispatch_get_main_queue();
- 1.程序一啟動(dòng)就會(huì)自動(dòng)創(chuàng)建主隊(duì)列,所以只需要get,不需要create
- 2.主隊(duì)列是特殊的串行隊(duì)列,主隊(duì)列里面無(wú)論是什么任務(wù)都是有序執(zhí)行的
- 3.主隊(duì)列是專門(mén)在主線程上調(diào)度任務(wù)執(zhí)行的;主隊(duì)列里面的任務(wù)
一定是在主線程執(zhí)行的 - 4.小結(jié) : 主隊(duì)列里面無(wú)論添加什么任務(wù),都是在主線程有序執(zhí)行的
- 5.提示 : 主隊(duì)列是主隊(duì)列.主線程是主線程
- 6.注意 : 隊(duì)列和線程的關(guān)系,隊(duì)列是調(diào)度任務(wù)的,線程是執(zhí)行任務(wù)的,現(xiàn)有調(diào)度,后有執(zhí)行
- 7.主隊(duì)列調(diào)度任務(wù)執(zhí)行,必須滿足一個(gè)條件,就是只有主線程空閑時(shí),主隊(duì)列才會(huì)調(diào)度任務(wù)在主線程執(zhí)
- 8.主隊(duì)列里面必須添加異步任務(wù)
4.全局隊(duì)列
程序一啟動(dòng)會(huì)默認(rèn)創(chuàng)建一個(gè)全局隊(duì)列,它的本質(zhì)是并行隊(duì)列;蘋(píng)果為了方便程序員快速的是任務(wù)異步執(zhí)行而準(zhǔn)備的
// 全局隊(duì)列,跟主隊(duì)列一樣不需要?jiǎng)?chuàng)建
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
* 參數(shù)1 : 隊(duì)列的優(yōu)先級(jí) / 隊(duì)列的服務(wù)器質(zhì)量;傳入0,是為了適配iOS7.0和8.0及以后,也是設(shè)置成默認(rèn)的
* 參數(shù)2 : 留著以后使用