有时候我们会有这样的需求:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组。
使用场景: 同时上传多个图片,所有图片上传完成之后去请求服务器上传图片地址。
dispatch_group_notify
原理:使用函数dispatch_group_create创建dispatch group,然后使用函数dispatch_group_async来将要执行的block任务提交到一个dispatch queue。同时将他们添加到一个组,等要执行的block任务全部执行完成之后,使用dispatch_group_notify函数接收完成时的消息。
使用示例:
/**
* 队列组 dispatch_group_notify
*/
- (void)groupNotify {
NSLog(@"currentThread---%@",[NSThread currentThread]); // 打印当前线程
NSLog(@"group---begin");
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 追加任务1
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"1---%@",[NSThread currentThread]); // 打印当前线程
}
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 追加任务2
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"2---%@",[NSThread currentThread]); // 打印当前线程
}
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步任务1、任务2都执行完毕后,回到主线程执行下边任务
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"3---%@",[NSThread currentThread]); // 打印当前线程
}
NSLog(@"group---end3");
});
NSLog(@"group---end");
}
//输出结果
2020-03-24 16:21:04.325304+0800 MyDemo[29802:1189401] currentThread---<NSThread: 0x280c33080>{number = 1, name = main}
2020-03-24 16:21:04.325376+0800 MyDemo[29802:1189401] group---begin
2020-03-24 16:21:04.325564+0800 MyDemo[29802:1189401] group---end
2020-03-24 16:21:06.328662+0800 MyDemo[29802:1189417] 2---<NSThread: 0x280cbc340>{number = 8, name = (null)}
2020-03-24 16:21:06.328754+0800 MyDemo[29802:1189421] 1---<NSThread: 0x280c6cd00>{number = 4, name = (null)}
2020-03-24 16:21:08.329835+0800 MyDemo[29802:1189417] 2---<NSThread: 0x280cbc340>{number = 8, name = (null)}
2020-03-24 16:21:08.334357+0800 MyDemo

最低0.47元/天 解锁文章
569

被折叠的 条评论
为什么被折叠?



