GCD同步若干个异步调用
2017-02-13 10:38
405 查看
应用场景
根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图
根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图
原理
使用Dispatch Group追加block到Global Group Queue,这些block如果全部执行完毕,就会执行Main ,Dispatch Queue中的结束处理的block实现
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ /*加载图片1 */ }); dispatch_group_async(group, queue, ^{ /*加载图片2 */ }); dispatch_group_async(group, queue, ^{ /*加载图片3 */ }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 合并图片 });
实例
// 用整除3,余数1,余数2,模拟图片加载,最终添加到总的数组模拟图片合成 - (void)synchronizeGroupWithAsynchronousCall { __block NSMutableArray *mArray1, *mArray2, *mArray3, *array; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ /*加载图片1 */ mArray1 = [NSMutableArray array]; for (int i = 0; i <= 30; i++) { if (i % 3 == 0) { printf("----%d\n", i); [mArray1 addObject:@(i)]; } } NSLog(@"----thread%@", [NSThread currentThread]); }); dispatch_group_async(group, queue, ^{ /*加载图片2 */ mArray2 = [NSMutableArray array]; for (int i = 0; i <= 30; i++) { if (i % 3 == 1) { printf("++++%d\n", i); [mArray2 addObject:@(i)]; } } NSLog(@"++++thread%@", [NSThread currentThread]); }); dispatch_group_async(group, queue, ^{ /*加载图片3 */ mArray3 = [NSMutableArray array]; for (int i = 0; i <= 30; i++) { if (i % 3 == 2) { printf("~~~~%d\n", i); [mArray3 addObject:@(i)]; } } NSLog(@"~~~~thread%@", [NSThread currentThread]); }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 合并图片 array = [NSMutableArray array]; [array addObjectsFromArray:mArray1]; [array addObjectsFromArray:mArray2]; [array addObjectsFromArray:mArray3]; for (NSNumber *num in array) { NSLog(@"num = %@", num); } NSLog(@"thread%@", [NSThread currentThread]); }); // dispatch_group_notify(group, queue, ^{ // // 如果这里还有基于上面两个任务的结果继续执行一些代码,建议还是放到子线程中,等代码执行完毕后在回到主线程 // // // 回到主线程 // dispatch_async(dispatch_get_main_queue(), ^{ // // 执行相关代码... // }); // }); }
相关文章推荐
- iOS开发-如何用GCD同步若干个异步调用?
- 如何用GCD同步若干个异步调用
- .Net下的MSMQ(微软消息队列)的同步异步调用
- 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式
- C# 委托的三种调用示例(同步调用 异步调用 异步回调) 之 FUNC 版
- 自定义Volley添加请求头、发送Post请求、Volley的同步和异步、getParams 不被调用
- Silverlight中通过Javascript的XmlHttp调用服务器端内容的同步与异步问题
- Linux下同步模式、异步模式、阻塞调用、非阻塞调用总结
- ios GCD同步异步
- GCD使用 串行并行队列 与 同步异步执行的各种组合 及要点分析
- GCD的定义及使用详解(同步异步、并发串行、线程间通信、延时执行、只执行一次代码)
- spring cloud学习笔记3(同步调用、异步调用、响应式调用)
- 同步调用、回调和异步调用的区别
- 同步调用、异步调用、异步回调的区别
- 普通方法调用,Invoke,begininvoke三者的区别总结及异步与同步的区别总结
- 用GCD线程组与GCD信号量将异步线程转换为同步线程
- 同步调用异步方法how-would-i-run-an-async-taskt-method-synchronously
- 同步调用与异步调用
- C#(同步调用、异步调用、异步回调)
- [转]同步与异步调用http请求 iphone开发