你的位置:首页 > 操作系统

[操作系统]用GCD线程组与GCD信号量将异步线程转换为同步线程


有时候我们会碰到这样子的一种情形:

同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的数据之后才能够进行下一步的操作,这个时候,就是线程组与信号量的用武之地了.

 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

打印结果:

2016-03-15 04:01:53.279 NetWorking[83611:1508240] 成功请求数据1:__NSCFDictionary
2016-03-15 04:01:53.280 NetWorking[83611:1508240] 成功请求数据2:__NSCFDictionary
2016-03-15 04:01:53.281 NetWorking[83611:1508287] 完成了网络请求,不管网络请求失败了还是成功了。