需求:同時進行兩次網絡請求,網絡請求是異步的,在網絡請求成功后進行其它的操作。兩個網絡請求是這樣,一個網絡請求中block執行完之后,再進行其它操作,也是一樣的原理,只是這時候不需要線程組了,只需要信號量。當然也適用於所有的block。
接下來就說下,在兩次異步請求之后要做的操作。
利用線程組和信號量來完成,看代碼
- (void)getData { NSString *appIdKey = @"8781e4ef1c73ff20a180d3d7a42a8c04"; NSString* urlString_1 = @"http://api.openweathermap.org/data/2.5/weather"; NSString* urlString_2 = @"http://api.openweathermap.org/data/2.5/forecast/daily"; NSDictionary* dictionary =@{ @"lat" : @"40.04991291", @"lon" : @"116.25626162", @"APPID" : appIdKey }; // 創建隊列組,可以使兩個網絡請求異步執行,執行完之后再進行操作 dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 創建信號量 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager]; [mgr GET:urlString_1 parameters:dictionary progress:^(NSProgress * _Nonnull downloadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 請求成功發送信號量(+1) dispatch_semaphore_signal(semaphore); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 無論請求成功或失敗都發送信號量(+1) dispatch_semaphore_signal(semaphore); }]; // 在請求成功之前等待信號量(-1) dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); }); dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 創建信號量 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager]; [mgr GET:urlString_2 parameters:dictionary progress:^(NSProgress * _Nonnull downloadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 發送信號量 dispatch_semaphore_signal(semaphore); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 發送信號量 dispatch_semaphore_signal(semaphore); }]; // 在請求成功之前等待信號量 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); }); // 請求完成之后 dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ }); }