03-GCD

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 : 留著以后使用
最后編輯于
?著作權(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)容