举个栗子:异步请求A图片和B图片和C图片,在最后合成ABC图
-(void)group{
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//这里走了个异步函数,该函数不等里边请求完毕就返回
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(3);
NSLog(@"A图片");
});
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"B图片");
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"C图片");
});
dispatch_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"合成图");
});
}
//打印顺序:
2018-04-06 16:01:16.960640+0800 COCOCOCO[13546:578928] B
2018-04-06 16:01:16.960675+0800 COCOCOCO[13546:578926] C
2018-04-06 16:01:16.961241+0800 COCOCOCO[13546:578877] D
2018-04-06 16:01:19.964354+0800 COCOCOCO[13546:578930] A
正确写法:
-(void)rightGroup{
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
//这里不一定用dispatch_group_async,也可以dispatch_async
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(3);
NSLog(@"拿到A图片");
dispatch_group_leave(group);
});
});
dispatch_group_enter(group);
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(2);
NSLog(@"拿到B图片");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
NSLog(@"拿到C图片");
dispatch_group_leave(group);
});
dispatch_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"合成D图片");
});
}
打印:
2018-04-06 16:11:40.070776+0800 COCOCOCO[13688:585282] 拿到C图片
2018-04-06 16:11:41.072284+0800 COCOCOCO[13688:585280] 拿到B图片
2018-04-06 16:11:42.071223+0800 COCOCOCO[13688:585279] 拿到A图片
2018-04-06 16:11:42.071636+0800 COCOCOCO[13688:585221] 合成D图片
本文通过一个具体的示例,介绍了如何使用GCD的组通知机制来确保多个异步任务全部完成后再进行后续操作。文章对比了错误的实现方式与正确的实现方式,并展示了正确的打印顺序。
1233

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



