開發中,有時候一個頁面需要多個網絡請求之后才能更新ui,這時候我們可以用嵌套請求方法,但是如果網絡請求比較多,那么嵌套方法肯定不行了,太麻煩對吧,這時候不放用一下gcd的信號量
// 創建組 [MBPRogressHUD showMessage:@"加載中..."]; 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); NSString *strurl=[HSTools Joint:URL_GUBRI]; NSMutableDictionary *parameters=[NSMutableDictionary dictionary]; parameters[@"region_id"]=self.region_id; [JSCHttpTool GET:strurl parameters:parameters success:^(id responSEObject) { NSLog(@"網絡一請求成功"); if ([responseObject[@"code"] integerValue] == 1){ [self.unitArray removeAllObjects]; for (NSDictionary *unitsdict in responseObject[@"units"]) { UnitModel *model=[[UnitModel alloc] init]; model.address=unitsdict[@"address"]; model.contact_number=unitsdict[@"contact_number"]; [self.unitArray addObject:model]; } // 如果請求成功,發送信號量 dispatch_semaphore_signal(semaphore); } } failure:^(NSError *error) { NSLog(@"網絡一請求失敗"); [MBProgressHUD hideHUD]; //dispatch_semaphore_signal(semaphore); }]; // 在網絡請求任務成功之前,信號量等待中 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); NSString *strurl=[HSTools Joint:URL_GUBRI]; NSMutableDictionary *parameters=[NSMutableDictionary dictionary]; parameters[@"region_id"]=self.region_id; [JSCHttpTool GET:strurl parameters:parameters success:^(id responseObject) { NSLog(@"網絡二請求成功"); if ([responseObject[@"code"] integerValue] == 1){ [self.otherunitArray removeAllObjects]; for (NSDictionary *unitsdict in responseObject[@"units"]) { UnitModel *model=[[UnitModel alloc] init]; model.address=unitsdict[@"address"]; model.contact_number=unitsdict[@"contact_number"]; [self.otherunitArray addObject:model]; } // 如果請求成功,發送信號量 dispatch_semaphore_signal(semaphore); } } failure:^(NSError *error) { NSLog(@"網絡二請求失敗"); [MBProgressHUD hideHUD]; // dispatch_semaphore_signal(semaphore); }]; // 在網絡請求任務成功之前,信號量等待中 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); }); dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [MBProgressHUD hideHUD]; NSLog(@"完成了網絡請求,并且都成功。"); NSLog(@"self.unitArray.count--%lu",(unsigned long)self.unitArray.count); NSLog(@"self.otherunitArray.count--%lu",(unsigned long)self.otherunitArray.count); });代碼中,我在每個failure里面都寫了一行注釋掉的// dispatch_semaphore_signal(semaphore); 是因為,如果有時候我們需要不論請求成功還是失敗,都走dispatch_group_notify方法的話,就可以打開此處的注釋。在這里我是需要兩個請求全部成功之后才允許走dispatch_group_notify方法的。
補充:經測試dispatch_group_notify里面更新ui的方法十分的卡,具體為什么,請大神評論告知
解決方法:已經找到解決方法,多個網絡請求結束之后我們需要回到主線程刷新ui界面。
以下是更改過后的代碼
// 創建組 [MBProgressHUD showMessage:@"加載中..."]; 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); NSString *strurl=[HSTools Joint:URL_GUBRI]; NSMutableDictionary *parameters=[NSMutableDictionary dictionary]; parameters[@"region_id"]=self.region_id; [JSCHttpTool GET:strurl parameters:parameters success:^(id responseObject) { NSLog(@"網絡一請求成功"); if ([responseObject[@"code"] integerValue] == 1){ [self.unitArray removeAllObjects]; for (NSDictionary *unitsdict in responseObject[@"units"]) { UnitModel *model=[[UnitModel alloc] init]; model.address=unitsdict[@"address"]; model.contact_number=unitsdict[@"contact_number"]; [self.unitArray addObject:model]; } // 如果請求成功,發送信號量 dispatch_semaphore_signal(semaphore); } } failure:^(NSError *error) { NSLog(@"網絡一請求失敗"); [MBProgressHUD hideHUD]; //dispatch_semaphore_signal(semaphore); }]; // 在網絡請求任務成功之前,信號量等待中 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); NSString *strurl=[HSTools Joint:URL_GUBRI]; NSMutableDictionary *parameters=[NSMutableDictionary dictionary]; parameters[@"region_id"]=self.region_id; [JSCHttpTool GET:strurl parameters:parameters success:^(id responseObject) { NSLog(@"網絡二請求成功"); if ([responseObject[@"code"] integerValue] == 1){ [self.otherunitArray removeAllObjects]; for (NSDictionary *unitsdict in responseObject[@"units"]) { UnitModel *model=[[UnitModel alloc] init]; model.address=unitsdict[@"address"]; model.contact_number=unitsdict[@"contact_number"]; [self.otherunitArray addObject:model]; } // 如果請求成功,發送信號量 dispatch_semaphore_signal(semaphore); } } failure:^(NSError *error) { NSLog(@"網絡二請求失敗"); [MBProgressHUD hideHUD]; // dispatch_semaphore_signal(semaphore); }]; // 在網絡請求任務成功之前,信號量等待中 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); }); dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_main_queue(), ^{ [MBProgressHUD hideHUD]; NSLog(@"完成了網絡請求,并且都成功。"); NSLog(@"self.unitArray.count--%lu",(unsigned long)self.unitArray.count); NSLog(@"self.otherunitArray.count--%lu",(unsigned long)self.otherunitArray.count); });// 也可以加判斷語句// if (判斷語句) {// // 返回主線程進行界面上的修改// dispatch_async(dispatch_get_main_queue(), ^{// 更新ui// });// }else{// dispatch_async(dispatch_get_main_queue(), ^{// 更新ui// });// } });新聞熱點
疑難解答