/**
* 使用dispatch_group,異步多請求
*/
- (void)asyncBaseData
{
// 全局并行隊列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
// 創建一個group
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, globalQueue, ^{
// 執行請求1... (這里的代碼需要時同步執行才能達到效果)
});
dispatch_group_async(group, globalQueue, ^{
// 執行請求2...
});
dispatch_group_async(group, globalQueue, ^{
// 執行請求N...
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"全部請求執行完畢!");
});
}
當dispatch_group_async的block里面執行的是異步任務,如果還是使用上面的方法你會發現異步任務還沒跑完就已經進入到了dispatch_group_notify方法里面了,這時用到dispatch_group_enter和dispatch_group_leave就可以解決這個問題:
// 全局變量group
group = dispatch_group_create();
// 并行隊列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 進入組(進入組和離開組必須成對出現, 否則會造成死鎖)
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
// 執行異步任務1
[self fetchBaseData];
});
// 進入組
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
// 執行異步任務2
[self fetchInspectorBaseData];
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
[SVProgressHUD dismiss];
ILog(@"全部基礎數據下載完畢!");
[[AppDelegate sharedDelegate] showMainView];
});
}
#pragma mark - 獲取基礎數據
- (void)fetchBaseData
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[SVProgressHUD showWithStatus:@"下載基礎數據中..."];
});
NSDictionary *params = @{ kPage: @0, kPageSize: @9999 };
[BaseDataService fetchBaseDataWithParams:params showHUD:NO success:^(NSDictionary *response) {
if ([response[kStatusCode] intValue] == kSuccessCode) {
NSArray *array = [BaseDataModel arrayOfModelsFromDictionaries:response[@"rows"] error:nil];
if (!array || !array.count ) {
[SVProgressHUD showErrorWithStatus:@"下載基礎數據失敗"];
return;
}
// 保存數據庫
[BaseDataService saveBaseData:array];
// 離開組
dispatch_group_leave(group);
}
} failure:^(NSError *error) {
}];
}
#pragma mark - 獲取巡查基礎數據
- (void)fetchInspectorBaseData
{
NSDictionary *params = @{ kPage: @0, kPageSize: @9999 };
[BaseDataService fetchInspectorBaseDataWithParams:params showHUD:NO success:^(NSDictionary *response) {
[SVProgressHUD dismiss];
if ([response[kStatusCode] intValue] == kSuccessCode) {
NSArray *array = [InspectorBaseDataModel arrayOfModelsFromDictionaries:response[@"rows"] error:nil];
if (!array || !array.count ) {
[SVProgressHUD showErrorWithStatus:@"下載巡查基礎數據失敗"];
return;
}
// 保存數據庫
[BaseDataService saveInspectorBaseData:array];
// 離開組
dispatch_group_leave(group);
}
} failure:^(NSError *error) {
}];
}