上一篇 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