如何确定多个接口都已请求完成?

引言:

在日常开发中经常会遇到 需要同时请求多个接口, 在多个接口同时请求完成时再做相关业务处理。 可以使用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();
        });
    });
}