iOS开发系列-线程同步dispatch_group(摘录)

本笔记参考该该作者帖子,自己学习,提升使用

当我们想让所有任务执行完毕后做一些特定的事情,即队列同步问题,通常这种问题出现在并发队列中,这时候我们就可以使用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");

你可能感兴趣的:(iOS开发系列-线程同步dispatch_group(摘录))