GCD使用-同一个界面多个请求结束在做下一步操作的总结

dispatch_group_enter:通知group,下面的任务马上要放到group中执行了。

dispatch_group_leave:通知group,任务完成了,该任务要从group中移除了。

基于enter和leave,可以实现

demo中的需求是 两个网络请求可有可无都是判断往下一步走的条件,如果两个都是NO,则不判断直接走下一步,思路就是,在每一个网络请求结束之后,返回一个状态

#pragma mark - 网络请求 同步
- (void)loadRequest:(BOOL)firAdd secAdd:(BOOL)secAdd
{
    __block int ifRefresh = 0;

    dispatch_group_t dispatchGroup = dispatch_group_create();
    if (firAdd) {
        dispatch_group_enter(dispatchGroup);
        [self httpRequest:^{
            NSLog(@"第一个请求完成成功");
            
            ifRefresh ++;
            
            dispatch_group_leave(dispatchGroup);
            
        } fail:^{
            NSLog(@"第一个请求完成失败");
            dispatch_group_leave(dispatchGroup);
        }];
    }
    if (secAdd) {
        dispatch_group_enter(dispatchGroup);
        [self httpRequestNum:^{
            NSLog(@"第二个请求完成成功");
            
            ifRefresh ++;
            
            dispatch_group_leave(dispatchGroup);
        } fail:^{
            NSLog(@"第二个请求完成失败");
            dispatch_group_leave(dispatchGroup);
        }];
    }
    
    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
       
        NSLog(@"请求完成");
        if (ifRefresh == ((firAdd?0:1)+(secAdd?0:1))) {
            NSLog(@"刷新");
        }
        else
        {
            NSLog(@"不刷新");
        }
        
    });
}

代码如下:

-(void)httpRequest:(void (^)(void))succ fail:(void (^)(void))fail{
    
    if (num>5) {
        succ();
    }
    else{
        fail();
    }
    
}
-(void)httpRequestNum:(void (^)(void))succ fail:(void (^)(void))fail{
    
    sleep(5);
    
    if (num>5) {
        succ();
    }
    else{
        fail();
    }
    
}

此处用随机数模拟是否成功失败,sleep5当做网络请求的延时,无论成功失败,都要返回,告知请求结束。

 

项目参考代码:https://github.com/Rain-wz/asynTest.git

转载于:https://my.oschina.net/rainwz/blog/1476433

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值