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");
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 担心了两周的我终于轮到去医院做胃镜检查了!去的时候我都想好了最坏的可能(胃癌),之前在网上查的症状都很相似。...
    Dely阅读 9,278评论 21 42
  • Quality of Service(QoS) 这是在iOS8之后提供的新功能,苹果提供了几个Quality of...
    树下老男孩阅读 15,725评论 10 132
  • iOS 多线程系列 -- 基础概述iOS 多线程系列 -- pthreadiOS 多线程系列 -- NSThrea...
    shannoon阅读 904评论 0 2
  • 简介 GCD(Grand Central Dispatch)是在macOS10.6提出来的,后来在iOS4.0被引...
    sunmumu1222阅读 908评论 0 2
  • 感恩洗潔精,將油膩的鍋碗幫我洗乾淨; 感恩洗衣機,替我洗乾淨家人一大堆衣物; 感恩爸爸給我開中藥,還幫我取回來; ...
    善心慈阅读 165评论 0 0