iOS AFNetWorking与线程同步
来源:互联网 发布:深圳代理注册公司 知乎 编辑:程序博客网 时间:2024/06/05 23:02
在iOS开发中,页面的数据并不是通过一个接口进行获取的,有时候需要从服务器的多个接口获取数据,然后进行页面的更行,有时候需要在获取一个接口的数据后,根据得到的数据再获取其他接口的数据。
而开源框架AFNetWorking是一个常用的强大的第三方框架,我们可以利用AFNetWorking和GCD结合的方式完成以上两个需求。
(1)获取多个接口数据后,创建或者reload UITableview。将网络获取数据的操作放到线程组中,当每个线程都完成了后,在主线程根新页面。
例如:
1和2的数据来自两个不同的接口。项目要求,一起加载。那么我们就可以利用线程组进行解决。
具体代码如下:
#pragma mark -将取得用户收货地址和商品列表放入队列中-(void)getInitInfoFromServer{ dispatch_group_t group = dispatch_group_create(); // 2 设置头部 _manager.responseSerializer = [AFJSONResponseSerializer serializer]; _manager.requestSerializer = [AFJSONRequestSerializer serializer]; GCToken *token = [GCTokenManager getToken]; NSString *tokenStr = [GCTokenManager getFullToken:token]; [_manager.requestSerializer setValue:tokenStr forHTTPHeaderField:@"Authorization"]; //Enter group dispatch_group_enter(group); // 获取默认 NSString *addressStr = @"http://XXXXXXXXXXXXXXXXX"; [_manager GET:addressStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSMutableArray *dataDics = responseObject[@"data"]; _defaultAddressModel = [GCAddressModel mj_objectWithKeyValues:dataDics]; dispatch_group_leave(group); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"取得的收货地址列表失败----%@",error); dispatch_group_leave(group); }]; dispatch_group_enter(group); NSString *shoppingCartUrl = @"http://XXXXXXXXXXXX"; [_manager GET:shoppingCartUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSMutableArray *dataDics = responseObject[@"items"]; _shoppingCartArrs = [GCShoppingCartProductModel mj_objectArrayWithKeyValuesArray:dataDics]; dispatch_group_leave(group); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"取得的购物车数据失败----%@",error); dispatch_group_leave(group); }]; dispatch_group_notify(group, dispatch_get_main_queue(), ^(){ //初始化页面或更新页面 [self initAllView]; });}
(2)需要在获取一个接口的数据后,根据得到的数据再获取其他接口的数据。
有一个需求是修改用户收货地址,保存并使用,保存收货地址是一个接口,而后取得收货地址更新页面。在这里有两种做法,第一种是保存收货地址成功后,在回调的block中修改模型,并跳转到相应页面。第二种是,在修改模型的接口,修改模型成功后,在调用获取收货地址的接口,获取到收货地址,并进行下一步操作。
假如项目要求使用两次与服务器进行交互的这种方式,我们依然可以使用线程组进行简单的解决。
现在有具体需求:
点击收货地址,将收货地址设置为默认收货地址,并重新更新页面。
在设置默认的收货地址成功后,在回调函数中直接进行收货地址列表的获取,并更新页面,在这一些列操作完成后,利用dispatch_group_notify(group, dispatch_get_main_queue()
进行其他想要的操作,类似于通知。
具体代码如下:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ _HUD = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; _HUD.labelText = @"请稍等"; dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group); _selectedIndex = (int)indexPath.row; // 取得连接 GCAddressModel *model = _addressArrs[indexPath.row]; NSString *defaultAddressStr = [[NSString alloc]initWithFormat:@"http://XXXXXXXX; [_manager POST:defaultAddressStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *addressStr = @"http://XXXXXXXX"; [_manager GET:addressStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSMutableArray *dataDics = responseObject[@"data"]; _addressArrs = [GCAddressModel mj_objectArrayWithKeyValuesArray:dataDics]; [_mainTableView reloadData]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"获取地址失败--%@",error); }]; dispatch_group_leave(group); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { dispatch_group_leave(group); NSLog(@"设置默认收货地址失败"); }]; dispatch_group_notify(group, dispatch_get_main_queue(), ^{ [_HUD removeFromSuperview]; _HUD = nil; // 发送通知 [[NSNotificationCenter defaultCenter]postNotificationName:@"editDefaultAddress" object:nil]; });}
0 0
- iOS AFNetWorking与线程同步
- iOS 线程同步与锁
- 线程同步与线程通信 疯狂iOS讲义
- IOS多线程系统学习之线程同步与线程通信
- 【iOS】网络操作与AFNetworking
- 【iOS】网络操作与AFNetworking
- 【iOS】网络操作与AFNetworking
- 【iOS】网络操作与AFNetworking
- ios 网络操作与AFNetworking
- iOS网络操作与AFNetworking
- 【iOS】网络操作与AFNetworking
- 【iOS】网络操作与AFNetworking
- 【iOS】网络操作与AFNetworking
- 【iOS】网络操作与AFNetworking
- 【iOS】AFNetworking简介与使用
- 【iOS】网络操作与AFNetworking
- 【iOS】网络操作与AFNetworking
- 【iOS】网络操作与AFNetworking
- 剑指offer 14. 调整数组顺序使奇数位于偶数前面
- Gradle教程--基础篇
- Codeforces 799B
- springcloud(二):注册中心Eureka
- 根据输入选项shell脚本添加信息
- iOS AFNetWorking与线程同步
- 开源 java CMS
- 二维数组的遍历
- Mac显示隐藏文件方法
- Ubuntu 16.04 安装 tweak 及 Flatabulous 主题美化
- redis desktop manager 连不上
- MYSQL在不同系统下重置密码
- 【LeetCode】53. Maximum Subarray
- LeetCode 7. Reverse Integer