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 簡寫
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ù)),一定是有序執(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ì)列 : "可以"同時調(diào)度多個任務(wù)同時執(zhí)行(任務(wù)必須是異步任務(wù))
// 參數(shù)1 : 隊(duì)列的標(biāo)示符
// 參數(shù)2 : 隊(duì)列的屬性.決定了隊(duì)列是串行的還是并行的.
dispatch_queue_t queue = dispatch_queue_create("zj", DISPATCH_QUEUE_CONCURRENT);
- 同步任務(wù) : 不開新的線程,只在當(dāng)前線程執(zhí)行(如果當(dāng)前線程是子線程,同步任務(wù)就會在當(dāng)前的子線程執(zhí)行)
dispatch_sync(queue, ^{
NSLog(@"%d %@",i,[NSThread currentThread]);
});
- 異步任務(wù) : 會新開執(zhí)行
dispatch_async(queue, ^{
NSLog(@"%d %@",i,[NSThread currentThread]);
});
GCD隊(duì)列和任務(wù)組合總結(jié)
同步和異步?jīng)Q定了要不要開啟新的線程 (同步不開,異步開)
同步:在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力
異步:在新的線程中執(zhí)行任務(wù)家厌,具備開啟新線程的能力
串行和并發(fā)決定了任務(wù)的執(zhí)行方式
串行:一個任務(wù)執(zhí)行完畢后播玖,再執(zhí)行下一個任務(wù)
并發(fā):多個任務(wù)并發(fā)(同時)執(zhí)行
當(dāng)任務(wù)是異步的時候,隊(duì)列決定了開啟多少條線程
串行隊(duì)列 : 只開一條
并發(fā)隊(duì)列 : 可以開啟多條
3.主隊(duì)列
- 專門用來在主線程上調(diào)度任務(wù)的隊(duì)列.
- 不會開啟新線程.
- 以先進(jìn)先出的方式,在主線程空閑時才會調(diào)度隊(duì)列中的任務(wù)在主線程執(zhí)行.
- 如果當(dāng)前主線程正在有任務(wù)執(zhí)行,那么無論主隊(duì)列中當(dāng)前被添加了什么任務(wù),都不會被調(diào)度.
dispatch_queue_t queue = dispatch_get_main_queue();
- 1.程序一啟動就會自動創(chuàng)建主隊(duì)列,所以只需要get,不需要create
- 2.主隊(duì)列是特殊的串行隊(duì)列,主隊(duì)列里面無論是什么任務(wù)都是有序執(zhí)行的
- 3.主隊(duì)列是專門在主線程上調(diào)度任務(wù)執(zhí)行的;主隊(duì)列里面的任務(wù)
一定
是在主線程執(zhí)行的 - 4.小結(jié) : 主隊(duì)列里面無論添加什么任務(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í)行,必須滿足一個條件,就是只有主線程空閑時,主隊(duì)列才會調(diào)度任務(wù)在主線程執(zhí)
- 8.主隊(duì)列里面必須添加異步任務(wù)
4.全局隊(duì)列
程序一啟動會默認(rèn)創(chuàng)建一個全局隊(duì)列,它的本質(zhì)是并行隊(duì)列;蘋果為了方便程序員快速的是任務(wù)異步執(zhí)行而準(zhǔn)備的
// 全局隊(duì)列,跟主隊(duì)列一樣不需要創(chuàng)建
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
* 參數(shù)1 : 隊(duì)列的優(yōu)先級 / 隊(duì)列的服務(wù)器質(zhì)量;傳入0,是為了適配iOS7.0和8.0及以后,也是設(shè)置成默認(rèn)的
* 參數(shù)2 : 留著以后使用