本笔记参考该该作者帖子,自己学习,提升使用
当我们想让所有任务执行完毕后做一些特定的事情,即队列同步问题,通常这种问题出现在并发队列中,这时候我们就可以使用dispatch_group来实现了,dispatch_group能很方便的解决同步的问题。dispatch_group_create可以创建一个group对象,然后可以添加block到该组里面,下面看下它的一些用法:
- dispatch_group_wait
dispatch_group_wait会同步地等待group中所有的block执行完毕后才继续执行,类似于dispatch barrier
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
//将任务异步地添加到group中去执行
dispatch_group_async(group,queue,^{ NSLog(@"block1"); });
dispatch_group_async(group,queue,^{ NSLog(@"block2"); });
dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
NSLog(@"go on");
执行结果如下,只有block1跟block2执行完毕后才会执行
GCDTests[954:41031] block2
GCDTests[954:41032] block1
GCDTests[954:40847] go on
- dispatch_group_notify
功能与dispatch_group_wait类似,不过该过程是异步的,不会阻塞该线程,dispatch_group_notify有三个参数
void dispatch_group_notify(dispatch_group_t group, //要观察的group
dispatch_queue_t queue, //block执行的队列
dispatch_block_t block); //当group中所有任务执行完毕之后要执行的block
简单的示意用法:
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");
可以看到如下的执行结果:
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异步的将任务丢到group中去执行,这时候就需要用到dispatch_group_enter跟dispatch_group_leave方法,这两个方法要配对出现,以下这两种方法是等价的:
dispatch_group_async(group, queue, ^{
});
等价于
dispatch_group_enter(group);
dispatch_async(queue, ^{
dispatch_group_leave(group);
});
简单的使用方法,可以自己试试没有写dispatch_group_leave会发生什么。
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);
}
//等待上面的任务完成
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"go on");