有时候我们会碰到这样子的一种情形:同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的数据之后才能够进行下一步的操作,这个时候,就是线程组与信号量的用武之地了. 1 #import "ViewController.h" 2 #impo ...
有时候我们会碰到这样子的一种情形:
同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的数据之后才能够进行下一步的操作,这个时候,就是线程组与信号量的用武之地了.
1 #import "ViewController.h" 2 #import <AFNetworking.h> 3 4 5 @interface ViewController () 6 7 @end 8 9 @implementation ViewController10 11 - (void)viewDidLoad {12 [super viewDidLoad];13 [self getNetworkingData];14 }15 16 - (void)getNetworkingData{17 NSString *appIdKey = @"8781e4ef1c73ff20a180d3d7a42a8c04";18 NSString* urlString_1 = @"http://api.openweathermap.org/data/2.5/weather";19 NSString* urlString_2 = @"http://api.openweathermap.org/data/2.5/forecast/daily";20 NSDictionary* dictionary =@{@"lat":@"40.04991291",21 @"lon":@"116.25626162",22 @"APPID" : appIdKey};23 // 创建组24 dispatch_group_t group = dispatch_group_create();25 // 将第一个网络请求任务添加到组中26 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{27 // 创建信号量28 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);29 // 开始网络请求任务30 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];31 [manager GET:urlString_132 parameters:dictionary33 progress:nil34 success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {35 NSLog(@"成功请求数据1:%@",[responseObject class]);36 // 如果请求成功,发送信号量37 dispatch_semaphore_signal(semaphore);38 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {39 NSLog(@"失败请求数据");40 // 如果请求失败,也发送信号量41 dispatch_semaphore_signal(semaphore);42 }];43 // 在网络请求任务成功之前,信号量等待中44 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);45 });46 // 将第二个网络请求任务添加到组中47 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{48 // 创建信号量49 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);50 // 开始网络请求任务51 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];52 [manager GET:urlString_253 parameters:dictionary54 progress:nil55 success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {56 NSLog(@"成功请求数据2:%@",[responseObject class]);57 // 如果请求成功,发送信号量58 dispatch_semaphore_signal(semaphore);59 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {60 NSLog(@"失败请求数据");61 // 如果请求失败,也发送信号量62 dispatch_semaphore_signal(semaphore);63 }];64 // 在网络请求任务成功之前,信号量等待中65 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);66 });67 dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{68 NSLog(@"完成了网络请求,不管网络请求失败了还是成功了。");69 });70 }71 72 @end
原标题:用GCD线程组与GCD信号量将异步线程转换为同步线程
关键词:异步
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。