GCD使用基礎(chǔ) 三

dispatch_after

dispatch_after延遲將任務(wù)提交到隊(duì)列中,注意不是事先將任務(wù)添加到隊(duì)列中然后再延遲執(zhí)行。

dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(serialQueue, ^{
        NSLog(@"任務(wù)1,%@", [NSThread currentThread]);
    });

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5*NSEC_PER_SEC)), serialQueue, ^{
        NSLog(@"5秒后提交該block,%@", [NSThread currentThread]);
    });
dispatch_sync(serialQueue, ^{
        NSLog(@"任務(wù)2,%@", [NSThread currentThread]);
    });
/**
dispatch_time_t
dispatch_time()創(chuàng)建時(shí)間
DISPATCH_TIME_NOW從現(xiàn)在開始計(jì)算
NSEC_PER_SEC=1秒
*/
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC));
dispatch_after(time, serialQueue, ^{
        NSLog(@"2秒后提交該block,%@", [NSThread currentThread]);
    });
dispatch_after

從打印日志可以看出,所有任務(wù)都是添加到串行隊(duì)列中的,由串行隊(duì)列的特性可知:先進(jìn)入對(duì)的任務(wù)結(jié)束,才會(huì)執(zhí)行后面的任務(wù),可驗(yàn)證dispatch_after是將任務(wù)延時(shí)添加到隊(duì)列中。

DISPATCH_TIME_NOW是指執(zhí)行到該行代碼時(shí)開始計(jì)算。

dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(serialQueue, ^{
        NSLog(@"任務(wù)1,%@", [NSThread currentThread]);
    });

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5*NSEC_PER_SEC)), serialQueue, ^{
        NSLog(@"5秒后提交該block,%@", [NSThread currentThread]);
    });
dispatch_sync(serialQueue, ^{
        NSLog(@"任務(wù)2,%@", [NSThread currentThread]);
        sleep(10);
    });
/**
dispatch_time_t
dispatch_time()創(chuàng)建時(shí)間
DISPATCH_TIME_NOW從現(xiàn)在開始計(jì)算
NSEC_PER_SEC=1秒
*/
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC));
dispatch_after(time, serialQueue, ^{
        NSLog(@"2秒后提交該block,%@", [NSThread currentThread]);
    });
DISPATCH_TIME_NOW

從兩次的打印日志中也可以看出,dispatch_after是另外開辟了一條線程執(zhí)行的。

dispatch_group_t

dispatch_group_t:調(diào)度組,可以將隊(duì)列中的任務(wù)放到調(diào)度組中,由調(diào)度組來控制任務(wù)的執(zhí)行。

dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, concurrentQueue, ^{
        NSLog(@"任務(wù)1%@", [NSThread currentThread]);
    });
dispatch_group_async(group, concurrentQueue, ^{
        NSLog(@"任務(wù)2%@", [NSThread currentThread]);
    });
dispatch_group_async(group, concurrentQueue, ^{
        NSLog(@"任務(wù)3%@", [NSThread currentThread]);
    });
dispatch_group_notify(group, concurrentQueue, ^{
        NSLog(@"調(diào)度組中concurrentQueue隊(duì)列的所有任務(wù)執(zhí)行完畢%@", [NSThread currentThread]);
    });
調(diào)度組1
  • dispatch_group_async:創(chuàng)建一個(gè)異步任務(wù)將其放在concurrentQueue隊(duì)列中,并關(guān)聯(lián)到調(diào)度組中。
  • dispatch_group_notify:concurrentQueue隊(duì)列中所有關(guān)聯(lián)到調(diào)度組中的任務(wù)結(jié)束時(shí)執(zhí)行。

dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_enter(group);
dispatch_async(concurrentQueue, ^{
        NSLog(@"任務(wù)1%@", [NSThread currentThread]);
        dispatch_group_leave(group);
    });

dispatch_group_enter(group);
dispatch_async(concurrentQueue, ^{
        NSLog(@"任務(wù)2%@", [NSThread currentThread]);
        dispatch_group_leave(group);
    });
    
dispatch_group_enter(group);
dispatch_async(concurrentQueue, ^{
        NSLog(@"任務(wù)3%@", [NSThread currentThread]);
        dispatch_group_leave(group);
    });
調(diào)度組2
  • dispatch_group_enter:任務(wù)入組。
  • dispatch_group_leave:任務(wù)出組。

dispatch_group_enterdispatch_group_leave需要成對(duì)出現(xiàn)。


dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC));
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(concurrentQueue, ^{
        NSLog(@"任務(wù)1%@", [NSThread currentThread]);
        dispatch_group_leave(group);
    });

dispatch_group_enter(group);
dispatch_async(concurrentQueue, ^{
        NSLog(@"任務(wù)2%@", [NSThread currentThread]);
        dispatch_group_leave(group);
    });
    
dispatch_group_enter(group);
dispatch_async(concurrentQueue, ^{
        sleep(5);
        NSLog(@"任務(wù)3%@", [NSThread currentThread]);
        dispatch_group_leave(group);
    });

dispatch_group_notify(group, concurrentQueue, ^{
        NSLog(@"調(diào)度組中concurrentQueue隊(duì)列的所有任務(wù)執(zhí)行完畢%@", [NSThread currentThread]);
    });
dispatch_async(dispatch_get_global_queue(0, 0), ^{
        dispatch_group_wait(group, time);
        NSLog(@"頂多等你三秒,調(diào)度組不結(jié)束我就干自己的事去了");
    });

調(diào)度組3

dispatch_group_wait:在指定時(shí)間或調(diào)度組結(jié)束時(shí),執(zhí)行下面的任務(wù)??梢詰?yīng)用在網(wǎng)絡(luò)請(qǐng)求時(shí)間較長時(shí)的處理。

dispatch_apply

dispatch_apply:重復(fù)提交任務(wù)到隊(duì)列中。

dispatch_apply(10, serialQueue, ^(size_t i) {
        NSLog(@"在線程中循環(huán)10次執(zhí)行該block%ld%@", i, [NSThread currentThread]);
    });
串行隊(duì)列重復(fù)提交

在當(dāng)前線程中執(zhí)行,不會(huì)開辟新的線程。


dispatch_apply(10, concurrentQueue, ^(size_t i) {
        NSLog(@"在線程中循環(huán)10次執(zhí)行該block%ld%@", i, [NSThread currentThread]);
    });

會(huì)開辟新的線程,異步執(zhí)行任務(wù)。

并行隊(duì)列重復(fù)提交

其他

  • dispatch_queue_get_label:獲取隊(duì)列的名字。
//獲取指定隊(duì)列的名字
NSLog(@"%s", dispatch_queue_get_label(serialQueue));
//獲取當(dāng)前隊(duì)列的名字
NSLog(@"%s", dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL));
最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 擔(dān)心了兩周的我終于輪到去醫(yī)院做胃鏡檢查了!去的時(shí)候我都想好了最壞的可能(胃癌),之前在網(wǎng)上查的癥狀都很相似。...
    Dely閱讀 9,409評(píng)論 21 42
  • iOS中GCD的使用小結(jié) 作者dullgrass 2015.11.20 09:41*字?jǐn)?shù) 4996閱讀 20199...
    DanDanC閱讀 1,331評(píng)論 0 0
  • 3.GCD GCD的全稱是Grand Central Dispatch,提供了非常多的純C語言的函數(shù) GCD的優(yōu)勢(shì)...
    Mario_ZJ閱讀 613評(píng)論 0 0
  • 1 GCD 術(shù)語 1.1 Serial vs. Concurrent 串行 vs. 并發(fā) 概念:該術(shù)語描述執(zhí)行當(dāng)前...
    NinthDay閱讀 4,134評(píng)論 2 38
  • 本篇博客共分以下幾個(gè)模塊來介紹GCD的相關(guān)內(nèi)容: 多線程相關(guān)概念 多線程編程技術(shù)的優(yōu)缺點(diǎn)比較? GCD中的三種隊(duì)列...
    有夢(mèng)想的老伯伯閱讀 1,092評(píng)論 0 4

友情鏈接更多精彩內(nèi)容