dispatch_group_enter用法和講解

這個方法主要和下面幾個方法一起使用的:

  • dispatch_group_enter
  • dispatch_group_leave
  • dispatch_group_notify
  • dispatch_group_wait

dispatch_group_enterdispatch_group_leave 一般是成對出現(xiàn)的, 進(jìn)入一次,就得離開一次。也就是說,當(dāng)離開和進(jìn)入的次數(shù)相同時,就代表任務(wù)組完成了。如果enterleave多,那就是沒完成,如果leave調(diào)用的次數(shù)多了, 會崩潰的;

看如下代碼:

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        [self test];
    });
}
- (void)test
{
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    dispatch_group_enter(group);
    NSLog(@"加入");
    NSLog(@"加入");
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 異步2秒后離開
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), queue, ^{
        NSLog(@"即將離開 - 1");
        dispatch_group_leave(group);
        NSLog(@"已經(jīng)離開 - 1");
    });
    
    // 異步3秒后離開
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), queue, ^{
        NSLog(@"即將離開 - 2");
        dispatch_group_leave(group);
        NSLog(@"已經(jīng)離開 - 2");
    });
    dispatch_group_notify(group, queue, ^{
        NSLog(@"都完成了");
    });
    NSLog(@"開始等待");
    dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)));
    NSLog(@"等待結(jié)束");
}

打印的結(jié)果是:

2018-03-19 11:55:59.077862+0800 Test[26326:1160676] 加入
2018-03-19 11:55:59.078010+0800 Test[26326:1160676] 加入
2018-03-19 11:55:59.078649+0800 Test[26326:1160676] 開始等待
2018-03-19 11:56:01.187318+0800 Test[26326:1160674] 即將離開 - 1
2018-03-19 11:56:01.187573+0800 Test[26326:1160674] 已經(jīng)離開 - 1
2018-03-19 11:56:02.377367+0800 Test[26326:1160674] 即將離開 - 2
2018-03-19 11:56:02.377703+0800 Test[26326:1160674] 已經(jīng)離開 - 2
2018-03-19 11:56:02.377732+0800 Test[26326:1160676] 等待結(jié)束
2018-03-19 11:56:02.377755+0800 Test[26326:1160681] 都完成了

dispatch_group_wait :在任務(wù)組完成時調(diào)用,或者任務(wù)組超時是調(diào)用(完成指的是enterleave次數(shù)一樣多)
dispatch_group_notify:不管超不超時,只要任務(wù)組完成,會調(diào)用,不完成不會調(diào)用

上面代碼,enter了兩次,wait是會阻塞當(dāng)前線程的,wait時間為6秒, 在6秒內(nèi)leave了兩次, 當(dāng)最后一次leave的時候,wait就會執(zhí)行(打開阻塞), 繼續(xù)往下執(zhí)行;NSLog(@"已經(jīng)離開 - 2");NSLog(@"等待結(jié)束");是異步進(jìn)行的;誰先誰后不一定;
最后一次的dispatch_group_leave(group);執(zhí)行完之后,dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)));這條代碼的阻塞就立即打開了,然后往下執(zhí)行

小伙伴可以自行修改延時leave時間,比如第二個延時改成8秒,試一試都會打印什么

如果覺得有幫助, 點個star吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 《孟子》海說102:為往圣繼絕學(xué) 盡心篇:去圣人之世若此其未遠(yuǎn)也,近圣人之居若此其甚也,然而無有乎爾,則亦無有乎爾...
    弘海先生閱讀 1,224評論 0 1
  • 做人做到極致就是一張票子。做人的最高境界就是成為硬通貨,不管是在熟悉的人當(dāng)中,還是在陌生的人當(dāng)中,大家都認(rèn)識你。 ...
    Lo俊彥閱讀 663評論 0 0
  • 致最愛的你~葛蘇 我比較喜歡用文字記錄生活,用文字表達(dá)心情,即使是發(fā)發(fā)牢騷也好,矯情一下也好,但是我覺得有些...
    高賽歌閱讀 485評論 0 0

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