iOS多线程-GCD之Dispatch Group

上一篇 iOS多线程-GCD之dispatch_set_target_queue

一、释义

//创建一个group
dispatch_group_t dispatch_group_create(void);

//将操作加入到group当中
void dispatch_group_async(dispatch_group_t group,
    dispatch_queue_t queue,
    dispatch_block_t block);

//通知某个执行队列,group中的异步操作全部执行完毕,可以追加其它操作
void dispatch_group_notify(dispatch_group_t group,
    dispatch_queue_t queue,
    dispatch_block_t block);

dispatch_group_create()会返回一个dispatch_group_t,只需要一个该类型的变量进行接收,即可使用了。
dispatch_group_async()会将操作放入group中,它有三个参数:

group----创建的group,这个group容纳一些异步操作
queue----追加操作执行的队列
block----追加的操作(即代码块)
注意:它没有对应的 dispatch_group_sync()

dispatch_group_notify()会在group中操作执行完毕后进行一个通知,它有三个参数:

group----进行监控的group
queue----group中操作执行完毕后的执行队列
block----group中操作执行完毕后再执行的操作

二、示例

//获取一个全局队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//创建一个group
dispatch_group_t group = dispatch_group_create();

//在group执行操作
dispatch_group_async(group, globalQueue, ^{ NSLog(@"1"); });
dispatch_group_async(group, globalQueue, ^{ NSLog(@"2"); });
dispatch_group_async(group, globalQueue, ^{ NSLog(@"3"); });
dispatch_group_async(group, globalQueue, ^{ NSLog(@"4"); });
dispatch_group_async(group, globalQueue, ^{ NSLog(@"5"); });

//group中的操作全部执行完,通知队列
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    NSLog(@"Done!");
});

执行结果:

2017-03-04 16:28:12.412 GCDLearn[918:46111] 1
2017-03-04 16:28:12.412 GCDLearn[918:46120] 5
2017-03-04 16:28:12.412 GCDLearn[918:46119] 4
2017-03-04 16:28:12.412 GCDLearn[918:46110] 2
2017-03-04 16:28:12.412 GCDLearn[918:46115] 3
2017-03-04 16:28:12.416 GCDLearn[918:45968] Done!

分析:在group作用下,前面数字输出顺序无论怎么变,Done都会在最后输出。

三、dispatch_group_wait

//定义
long dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);

第一个参数是一个group,第二个参数是一个dispatch_time类型的值,常用的有DISPATCH_TIME_FOREVER、DISPATCH_TIME_NOW。它会返回一个long类型的值,0代表执行完毕,1代表未执行完毕。

让我们将上面代码中 dispatch_group_notify()部分代码替换成 dispatch_group_wait()

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_group_wait(group, DISPATCH_TIME_NOW);

当参数是 DISPATCH_TIME_FOREVER 时,程序会一直等待group中操作执行完毕,所以它的返回值恒为0;
当参数是 DISPATCH_TIME_NOW 时,程序不会进行任何等待就会去判断group中的操作是否执行完毕。

推荐使用 dispatch_group_notify()

GCD学习代码 如果觉得有用,顺便给颗星哦😄
下一篇:iOS多线程-GCD之dispatch_barrier_async

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

推荐阅读更多精彩内容

  • iOS 多线程GCD之dispatch_group 本文通过介绍dispatch_group基本功能,通过实例讲解...
    HK_Hank阅读 12,787评论 6 19
  • 背景 担心了两周的我终于轮到去医院做胃镜检查了!去的时候我都想好了最坏的可能(胃癌),之前在网上查的症状都很相似。...
    Dely阅读 9,281评论 21 42
  • 1. GCD简介 什么是GCD呢?我们先来看看百度百科的解释简单了解下概念 引自百度百科:Grand Centra...
    千寻_544f阅读 416评论 0 0
  • iOS 多线程系列 -- 基础概述iOS 多线程系列 -- pthreadiOS 多线程系列 -- NSThrea...
    shannoon阅读 905评论 0 2
  • 在你的心里,可有着我不变的影子吗? 我知道,人对水的依恋就如植物对土地的依恋;猎人对大山;渔人对江河的依恋;更如我...
    覃梦云阅读 195评论 0 1