/**
* 使用dispatch_group高蜂,異步多請求
*/
- (void)asyncBaseData
{
// 全局并行隊列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
// 創(chuàng)建一個group
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, globalQueue, ^{
// 執(zhí)行請求1... (這里的代碼需要時同步執(zhí)行才能達到效果)
});
dispatch_group_async(group, globalQueue, ^{
// 執(zhí)行請求2...
});
dispatch_group_async(group, globalQueue, ^{
// 執(zhí)行請求N...
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"全部請求執(zhí)行完畢!");
});
}
當(dāng)dispatch_group_async的block里面執(zhí)行的是異步任務(wù),如果還是使用上面的方法你會發(fā)現(xiàn)異步任務(wù)還沒跑完就已經(jīng)進入到了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);
// 進入組(進入組和離開組必須成對出現(xiàn), 否則會造成死鎖)
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
// 執(zhí)行異步任務(wù)1
[self fetchBaseData];
});
// 進入組
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
// 執(zhí)行異步任務(wù)2
[self fetchInspectorBaseData];
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
[SVProgressHUD dismiss];
ILog(@"全部基礎(chǔ)數(shù)據(jù)下載完畢!");
[[AppDelegate sharedDelegate] showMainView];
});
}
#pragma mark - 獲取基礎(chǔ)數(shù)據(jù)
- (void)fetchBaseData
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[SVProgressHUD showWithStatus:@"下載基礎(chǔ)數(shù)據(jù)中..."];
});
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:@"下載基礎(chǔ)數(shù)據(jù)失敗"];
return;
}
// 保存數(shù)據(jù)庫
[BaseDataService saveBaseData:array];
// 離開組
dispatch_group_leave(group);
}
} failure:^(NSError *error) {
}];
}
#pragma mark - 獲取巡查基礎(chǔ)數(shù)據(jù)
- (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:@"下載巡查基礎(chǔ)數(shù)據(jù)失敗"];
return;
}
// 保存數(shù)據(jù)庫
[BaseDataService saveInspectorBaseData:array];
// 離開組
dispatch_group_leave(group);
}
} failure:^(NSError *error) {
}];
}