關(guān)于dispatch_group的概念以及幾種場景下的使用
1、關(guān)于dispatch_group
把一組任務(wù)提交到隊列中启搂,這些隊列可以不相關(guān)撵儿,然后監(jiān)聽這組任務(wù)完成的事件。
最常見的幾個方法:
1狐血、dispatch_group_create創(chuàng)建一個調(diào)度任務(wù)組
2淀歇、dispatch_group_async 把一個任務(wù)異步提交到任務(wù)組里
3、dispatch_group_enter/dispatch_group_leave 這種方式用在不使用dispatch_group_async來提交任務(wù)匈织,且必須配合使用
4浪默、dispatch_group_notify 用來監(jiān)聽任務(wù)組事件的執(zhí)行完畢
5、dispatch_group_wait 設(shè)置等待時間缀匕,在等待時間結(jié)束后纳决,如果還沒有執(zhí)行完任務(wù)組,則返回乡小。返回0代表執(zhí)行成功阔加,非0則執(zhí)行失敗
2、實際使用場景
場景1:
現(xiàn)在有4個任務(wù)满钟,任務(wù)1胜榔、任務(wù)2、任務(wù)3湃番、任務(wù)4. 任務(wù)3必須在任務(wù)2之后夭织,任務(wù)4必須在前3個任務(wù)都執(zhí)行完成后,才能執(zhí)行吠撮,并且需要在主線程更新UI尊惰。
思路分析:
任務(wù)3必須在任務(wù)2之后,所以這兩個必須串行執(zhí)行泥兰,同時弄屡,任務(wù)2和3整體可以和任務(wù)1并行執(zhí)行,最后鞋诗,任務(wù)4只能等待前3個任務(wù)全部執(zhí)行完成膀捷,才能執(zhí)行。這里就可以用group快速實現(xiàn)場景需求师脂。
代碼實現(xiàn):
-(void)disGroup{
dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t selfQuene = dispatch_queue_create("myQuene", 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, globalQuene, ^{
NSLog(@"run task 1");
});
dispatch_group_async(group, selfQuene, ^{
NSLog(@"run task 2");
});
dispatch_group_async(group, selfQuene, ^{
NSLog(@"run task 3");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"run task 4");
});
}
執(zhí)行結(jié)果如下:(結(jié)果1和結(jié)果2是一樣的担孔,只是1和2的順序區(qū)別)
結(jié)果1
或
結(jié)果2
總結(jié): 1和(2、3)是并行執(zhí)行關(guān)系吃警,2糕篇、3是串行執(zhí)行關(guān)系,且3肯定在2之后酌心,而4在(1拌消、2、3)全部完成之后才會執(zhí)行安券。
2墩崩、dispatch_group_enter(group)、dispatch_group_leave(group) 何時使用
理論上講侯勉,這兩個方法其實就是:手動管理group關(guān)聯(lián)的block的運行狀態(tài)(或計數(shù))鹦筹,并且使用時必須保證進入和退出group次數(shù)匹配。
所以:A和B兩種使用方式可以講是等價的
A)
dispatch_group_async(group, queue, ^{
// 址貌。铐拐。。
});
B)
dispatch_group_enter(group);
dispatch_async(queue, ^{
//练对。遍蟋。。
dispatch_group_leave(group);
});
所以螟凭,這種用法和直接使用dispatch_group_notify一定程度上是等價的虚青,大家可以自己選擇使用。
場景2:
有3個異步請求任務(wù)螺男,任務(wù)1棒厘、2、3下隧,在3個任務(wù)全部完成之后绊谭,需要執(zhí)行任務(wù)4,用以顯示界面數(shù)據(jù)汪拥。
用 dispatch_group_enter达传、 dispatch_group_leave 實現(xiàn):
-(void)disGroupEnterAndLeave{
dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
//任務(wù)1
dispatch_group_enter(group);
dispatch_async(globalQuene, ^{
NSLog(@"run task 1");
sleep(1);
dispatch_group_leave(group);
});
//任務(wù)2
dispatch_group_enter(group);
dispatch_async(globalQuene, ^{
NSLog(@"run task 2");
sleep(2);
dispatch_group_leave(group);
});
//任務(wù)3
dispatch_group_enter(group);
dispatch_async(globalQuene, ^{
NSLog(@"run task 3");
sleep(3);
dispatch_group_leave(group);
});
//一直等待完成
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
//任務(wù)3
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"run task 4");
});
}
執(zhí)行結(jié)果:
3個任務(wù)是并行執(zhí)行,且一共花費3s執(zhí)行迫筑,然后才執(zhí)行任務(wù)4宪赶。
當然,如果這樣想串行執(zhí)行3個任務(wù)脯燃,只需要把 全局隊列 換成 自定義隊列 即可搂妻。