如何确定多个接口都已请求完成?
引言:
在日常开发中经常会遇到 需要同时请求多个接口, 在多个接口同时请求完成时再做相关业务处理。 可以使用GCD中的信号量来实现。
# 一. 实现代码
#pragma mark - 加载数据
- (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个请求都已经完成, 信号量加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 时,函数会阻塞当前线程 等待 timeout 后
// sem > 0 时,该函数所处线程会继续执行下面语句,并将信号量减1
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
// 信号量大于0时 会执行下面代码
dispatch_async(dispatch_get_main_queue(), ^{
/// 所有请求完成
// 实现回调
success();
});
});
}