引言:
在日常開發(fā)中經(jīng)常會遇到 需要同時請求多個接口受啥, 在多個接口同時請求完成時再做相關業(yè)務處理。
可以使用GCD中的信號量來實現(xiàn)鸽心。
I. 實現(xiàn)代碼
#pragma mark - 加載數(shù)據(jù)
- (void)loadDataSuccess:(void (^)(void))success
failure:(void (^)(NSString *errorMessage))failure {
// 3個接口滚局,全部請求成功后刷新tableView
NSInteger totalCount = 3;
__block NSInteger requestCount = 0;
//初始化一個信號量 值為0
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/// 請求1
// 請求成功時加入下面代碼
// 請求成功 requestCount+1 后 與 totalCount 比較 相等時 說明3個請求都已經(jīng)完成, 信號量加1
if (++requestCount == totalCount) {
dispatch_semaphore_signal(sem); // 提高信號量 信號量加1
}
/// 請求2
// 請求成功時加入下面代碼
if (++requestCount == totalCount) {
dispatch_semaphore_signal(sem);
}
/// 請求3
// 請求成功時加入下面代碼
if (++requestCount == totalCount) {
dispatch_semaphore_signal(sem);
}
// 等待降低信號量
// sem = 0 時顽频,函數(shù)會阻塞當前線程 等待 timeout 后
// sem > 0 時藤肢,該函數(shù)所處線程會繼續(xù)執(zhí)行下面語句,并將信號量減1
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
// 信號量大于0時 會執(zhí)行下面代碼
dispatch_async(dispatch_get_main_queue(), ^{
/// 所有請求完成
// 實現(xiàn)回調
success();
});
});
}