本筆記參考該該作者帖子,自己學(xué)習(xí)兜粘,提升使用
當(dāng)我們想讓所有任務(wù)執(zhí)行完畢后做一些特定的事情界赔,即隊(duì)列同步問(wèn)題,通常這種問(wèn)題出現(xiàn)在并發(fā)隊(duì)列中锅铅,這時(shí)候我們就可以使用dispatch_group來(lái)實(shí)現(xiàn)了刃唐,dispatch_group能很方便的解決同步的問(wèn)題羞迷。dispatch_group_create可以創(chuàng)建一個(gè)group對(duì)象,然后可以添加block到該組里面画饥,下面看下它的一些用法:
- dispatch_group_wait
dispatch_group_wait會(huì)同步地等待group中所有的block執(zhí)行完畢后才繼續(xù)執(zhí)行,類似于dispatch barrier
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
//將任務(wù)異步地添加到group中去執(zhí)行
dispatch_group_async(group,queue,^{ NSLog(@"block1"); });
dispatch_group_async(group,queue,^{ NSLog(@"block2"); });
dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
NSLog(@"go on");
執(zhí)行結(jié)果如下衔瓮,只有block1跟block2執(zhí)行完畢后才會(huì)執(zhí)行
GCDTests[954:41031] block2
GCDTests[954:41032] block1
GCDTests[954:40847] go on
- dispatch_group_notify
功能與dispatch_group_wait類似,不過(guò)該過(guò)程是異步的抖甘,不會(huì)阻塞該線程热鞍,dispatch_group_notify有三個(gè)參數(shù)
void dispatch_group_notify(dispatch_group_t group, //要觀察的group
dispatch_queue_t queue, //block執(zhí)行的隊(duì)列
dispatch_block_t block); //當(dāng)group中所有任務(wù)執(zhí)行完畢之后要執(zhí)行的block
簡(jiǎn)單的示意用法:
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue,^{ NSLog(@"block1"); });
dispatch_group_async(group,queue,^{ NSLog(@"block2"); });
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"done");
});
NSLog(@"go on");
可以看到如下的執(zhí)行結(jié)果:
GCDTests[1046:45104] go on
GCDTests[1046:45153] block1
GCDTests[1046:45152] block2
GCDTests[1046:45104] done
- dispatch_group_enter dispatch_group_leave
假如我們不想使用dispatch_group_async異步的將任務(wù)丟到group中去執(zhí)行,這時(shí)候就需要用到dispatch_group_enter跟dispatch_group_leave方法,這兩個(gè)方法要配對(duì)出現(xiàn)薇宠,以下這兩種方法是等價(jià)的:
dispatch_group_async(group, queue, ^{
});
等價(jià)于
dispatch_group_enter(group);
dispatch_async(queue, ^{
dispatch_group_leave(group);
});
簡(jiǎn)單的使用方法偷办,可以自己試試沒(méi)有寫dispatch_group_leave會(huì)發(fā)生什么。
dispatch_group_t group = dispatch_group_create();
for (int i =0 ; i<3; i++) {
dispatch_group_enter(group);
NSLog(@"do block:%d",i);
dispatch_group_leave(group);
}
//等待上面的任務(wù)完成
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"go on");