GCD 中组队列group与Afnetworking的结合使用
来源:互联网 发布:星际淘宝网txt下载80 编辑:程序博客网 时间:2024/06/02 00:51
学了GCD以后,对所讲解的概念都有所了解了,但是对于group创建组队列,在组队列中是正确的使用AFnetworking发送网络请求。
下面分别来说一下吧。
1,我们使用 dispatch_group_enter(group);dispatch_group_leave(group);来解决
第一种情况,对某一个url多次请求的情况,
dispatch_group_t group = dispatch_group_create(); AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //Enter group for (int i =0; i<3; i++) { dispatch_group_enter(group); [manager GET:@"http://www.qq.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { //Deal with result... //Leave group NSLog(@"*********** 腾讯成功 %d ***********\n",i); dispatch_group_leave(group); }failure:^(AFHTTPRequestOperation *operation, NSError *error) { //Deal with error... //Leave group NSLog(@"*********** 腾讯失败 %d ***********\n",i); dispatch_group_leave(group); }]; //More request... } dispatch_group_notify(group, dispatch_get_main_queue(), ^(){ NSLog(@"<><><><><><><><> end <><><><><><><><><><><><><><><><>"); });
以前自己使用的时候都是单独创建一个global线程,在每个线程任务中加入网络请求,现在这样子写的话,减少了一层嵌套。
如果不是对某一个url多次请求的话,那么就需要
dispatch_group_t group = dispatch_group_create(); AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //Enter group dispatch_group_enter(group); [manager GET:@"https://www.baidu.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { //Deal with result... //Leave group NSLog(@"*********** 百度成功 ***********\n"); dispatch_group_leave(group); }failure:^(AFHTTPRequestOperation *operation, NSError *error) { //Deal with error... //Leave group NSLog(@"*********** 百度失败 ***********\n"); dispatch_group_leave(group); }]; //More request... dispatch_group_enter(group); [manager GET:@"https://www.163.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { //Deal with result... //Leave group NSLog(@"*********** 网易成功 ***********\n"); dispatch_group_leave(group); }failure:^(AFHTTPRequestOperation *operation, NSError *error) { //Deal with error... //Leave group NSLog(@"*********** 网易失败 ***********\n"); dispatch_group_leave(group); }]; dispatch_group_enter(group); [manager GET:@"http://www.qq.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { //Deal with result... //Leave group NSLog(@"*********** 腾讯成功 ***********\n"); dispatch_group_leave(group); }failure:^(AFHTTPRequestOperation *operation, NSError *error) { //Deal with error... //Leave group NSLog(@"*********** 腾讯失败 ***********\n"); dispatch_group_leave(group); }]; dispatch_group_notify(group, dispatch_get_main_queue(), ^(){ NSLog(@"<><><><><><><><> end <><><><><><><><><><><><><><><><>"); });
2,我们使用GCD中的信号量来解决:
代码如下:
BaiduWeatherForCityDailyModel * model = [[BaiduWeatherForCityDailyModel alloc] init]; //创建信号量 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 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, ^{ [RequestManager getRecentlyThreeDaysWeather:@{@"location":location, @"language":@"zh-Hans", @"unit":@"c", @"start":@"0", @"days":@"3"} callBack:^(id data) { if (data) { NSArray* dataArray = (NSArray*)data; model.dailyModelArray = [dataArray mutableCopy]; } dispatch_semaphore_signal(semaphore); }]; }); dispatch_group_async(group, queue, ^{ [RequestManager getWeatherLive:@{@"location":location, @"language":@"zh-Hans", @"unit":@"c"} callBack:^(id data) { if (data) { NSArray* dataArray = (NSArray*)data; model.temperature = [dataArray firstObject]; model.last_update = dataArray[1]; model.weatherStatus = [dataArray lastObject]; } dispatch_semaphore_signal(semaphore); }]; }); dispatch_group_notify(group, queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); callback(model); });
另外,关于AFnetworking内部的封装,我还要继续的去看,如果有所感悟,我会及时的分享给大家的。
0 0
- GCD 中组队列group与Afnetworking的结合使用
- mysql中GROUP BY结合GROUP_CONCAT的使用 [转]
- mysql中GROUP BY结合GROUP_CONCAT的使用
- mysql中GROUP BY结合GROUP_CONCAT的使用
- mysql中GROUP BY结合GROUP_CONCAT的使用
- mysql中GROUP BY结合GROUP_CONCAT的使用
- mysql中GROUP BY结合GROUP_CONCAT的使用
- mysql中GROUP BY结合GROUP_CONCAT的使用
- mysql中GROUP BY结合GROUP_CONCAT的使用
- distinct 多列问题结合group by的解决方法
- iOS中多线程与GCD的使用
- having和group by结合的使用
- AFNetworking 与 FMDB 使用过程中遇到的问题
- AFNetworking的介绍与使用
- AFNetworking的介绍与使用
- ios中AFNetworking的使用
- AFNetworking中operation的使用
- iOS中使用GCD中的Group管理子线程
- 【Leetcode】Consecutive Numbers
- Beyond Compare的两种常见用途
- Windows7,Ubuntu双系统,重装Windows8.1后恢复启动项
- Android Dev Intro - Camera Close Relevant
- Linux中状态为D或Z的进程
- GCD 中组队列group与Afnetworking的结合使用
- vi编辑只读文档无法保存的解决办法
- Java文件与IO(四)之其他流
- Android SingleTask 探究
- Box2d源码学习<二>内存管理之SOA的实现
- shader内置变量
- java+jsp导入excel
- VMware vShpere5 分布式网络交换机概念图
- NFA转换成DFA——汉字形式数字转换成整数数字