iOS - dispatch group用法(dispatch_group_leave、dispatch_group_enter)
来源:互联网 发布:苹果蓝牙共享网络 编辑:程序博客网 时间:2024/06/05 18:45
实际开发中经常遇到需要几个网络请求全部完成过后再进行页面渲染的情况
有过多线程了解的,可能会想到一下几种方式:
1.采用NSOperation的子类NSInvocationOperation、NSBlockOperation,添加依赖;
//创建NSInvocationOperation对象NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];//添加依赖,先执行1--->再执行2[operation2 addDependency:operation1];//创建NSOperationQueueNSOperationQueue * queue=[[NSOperationQueue alloc]init];//把操作添加到队列中[queue addOperation:operation1];[queue addOperation:operation2];
2.使用dispatch group,当group中方法全部执行完成后回到主队列中传值
//创建group dispatch_group_t group = dispatch_group_create(); //全局并发队列中添加第一个方法 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for (int i=0; i<1000; i++) { NSLog(@"%@ == %d",[NSThread currentThread],i); } }); //全局并发队列中添加第二个方法 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for (int i=0; i<1000; i++) { NSLog(@"%@ == %d",[NSThread currentThread],i); } }); //队列组中全部执行完成执行 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"全部执行完成"); });
发送的异步请求,当这个异步请求发送过后,就已经算这个方法执行完成。使用上述方法无法达到我们想要的效果。
3.dispatch_group_enter(<#dispatch_group_t group#>) 与dispatch_group_leave(<#dispatch_group_t group#>)搭配使用
//创建一个线程组 dispatch_group_t group = dispatch_group_create(); //存储错误信息 __block NSMutableArray *errorArr = [NSMutableArray new]; //存储返回回来的数据 __block NSArray *arr1 = [NSArray new]; __block NSArray *arr2 = [NSArray new]; __block NSArray *arr3 = [NSArray new]; //调用单独封装子网络请求方法(AFNetworking)在数据返回传值的block中leave dispatch_group_enter(group); [self XXXXXXXXXXXXXXXXXXXXXX1 complete:^(id data) { //Do Something dispatch_group_leave(group); }]; dispatch_group_enter(group); [self XXXXXXXXXXXXXXXXXXXXXX2 complete:^(id data) { //Do Something dispatch_group_leave(group); }]; dispatch_group_enter(group); [self XXXXXXXXXXXXXXXXXXXXXX3 complete:^(id data) { //Do Something dispatch_group_leave(group); }];#pragma mark - 完成全部数据请求回到主线程中传递数据并刷新UI dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"完成全部数据请求"); //如果有错误信息则数据请求失败 if (errorArr && errorArr.count>0) { handle(@{@"result":@"0",@"error":@"请求数据失败"}); }else{ //Do Something } });
使用这种方法就能达到我们想要的效果,一个enter 必须对应一个leave,成对出现!
0 0
- iOS - dispatch group用法(dispatch_group_leave、dispatch_group_enter)
- dispatch_group_enter、 dispatch_group_leave和dispatch_group_wait来实现同步
- 记录dispatch_group_enter()和dispatch_group_leave()的使用
- dispatch_group_enter、 dispatch_group_leave和dispatch_group_wait来实现同步
- CD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave处理多线程同步操作
- iOS开发之GCD(6)API Dispatch Group
- IOS:dispatch_group_enter的学习
- iOS dispatch_group_enter的使用
- iOS dispatch的一些用法
- iOS多线程GCD深入之Dispatch Group介绍
- iOS多线程GCD深入之Dispatch Group使用
- iOS开发中利用dispatch group实现并发多任务
- dispatch group机制
- dispatch group使用方法详解
- Dispatch Group的使用
- 并发 (三):Group Dispatch and DIY Dispatch
- iOS多线程的初步研究(七、八、九)-- dispatch对象-- dispatch队列-- dispatch源-- dispatch同步
- GCD 高级用法(一) dispatch after
- [The Hacker Playbook] 8.SPECIAL TEAMS-CRACKING,EXPLOITS,TRICKS
- 学习SpringMVC(九)之ModelAttribute源码分析
- hdu5688 Problem D
- android线程相关
- startActivityForResult和setResult详解
- iOS - dispatch group用法(dispatch_group_leave、dispatch_group_enter)
- Java 泛型
- Android通用流行框架大全
- 利用聚合数据实现天气预报APP
- 基于区块链的价值交易和管理系统
- #if, #elif, #else, #endif 使用
- 聊聊HTTPS和SSL/TLS协议
- iOS--通知的使用(NSNotificationCenter )
- [js]关于闭包与访问数组下标的老生常谈