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)