文档章节

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

RainOrz
 RainOrz
发布于 2017/07/20 16:00
字数 372
阅读 36
收藏 1

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

© 著作权归作者所有

共有 人打赏支持
RainOrz
粉丝 7
博文 110
码字总数 82350
作品 0
青浦
程序员
iOS之利用GCD信号量控制并发网络请求

引 对计算机了解的都会知道信号量的作用,当我们多个线程要访问同一个资源的时候,往往会设置一个信号量,当信号量大于0的时候,新的线程可以去操作这个资源,操作时信号量-1,操作完后信号量...

cloudox_
2017/05/03
0
0
Objective-C多线程开发之GCD(最全总结)

什么是CGD呢?以下摘自苹果的官方说明。   Grand Central Dispatch (GCD) 是异步执行任务的技术之一。应用程序中记述的线程管理用的代码是在系统级中实现的。开发者只需要定义想要执行的任...

儒此优雅
05/29
0
0
GCD group在多个网络请求的响应之前就已经执行

使用GCD进行多文件下载时,我们可以很方便的使用dispatchgroup进行管理。但是碰到网络请求都发出去了,想等到他们都响应,在执行下一步操作,有时候会惊奇的发现dispatchgroupnotify()竟然在...

骊山语罢清宵半
2016/01/19
434
0
iOS多线程开发——GCD的使用与多线程开发浅析(二)

对于iOS多线程开发,我们时刻处于学习之中,在看书中,看文档中,项目开发中,都可以去提高自己。最近刚看完了《Objective-C高级编程 iOS与OS X多线程和内存管理》这本书后,对多线程有了更为...

CHENYUFENG1991
2016/07/02
0
0
iOS多线程归纳

pthread NSThread NSOperation GCD 一.并行队列 1.向并行队列提交同步任务,(根据显示结果可知:所有任务全部在主线程执行,所有任务都是按顺序执行的) 2.向并行队列提交异步任务(根据结果...

Eysolitude
2016/03/08
44
0

没有更多内容

加载失败,请刷新页面

加载更多

Delphi 常用API 函数(好多都没见过)

AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeIconicWindows 排列一个父窗口的最小化子窗口 AttachThread...

dillonxiao
32分钟前
1
0
阿里云ubuntu配置Android开发环境编译Apk

1.命令行下载Android SDK $ wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz $ tar zxvf android-sdk_r24.4.1-linux.tgz 2.列出可以现在的SDK ./android list sdk  -a 3......

SuShine
33分钟前
1
0
maven导出项目依赖的jar包

一、导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的jar包:进入工程pom.xml 所在的目录下,执行如下命令: mvn dependency:copy-dependencies 二、导出到自定义目录中 在mav...

来来来来来
33分钟前
1
0
Win10下React Native环境安装教程及错误处理办法(实测)

https://blog.csdn.net/zhangatle/article/details/53289471 准备工作 注意:小米手机MIUI有坑,文末有解决方法 1 首先,你需要先安装Node.js并进行环境变量的配置,具体可以参考我的另一篇文...

james_laughing
33分钟前
1
0
IDEA2018 Mybatis plugin破解

IDEA2018 Mybatis plugin破解 Mybatis Plugin 一、Mybatis Plugin插件是什么 提供Mapper接口与配置文件中对应SQL的导航 编辑XML文件时自动补全 根据Mapper接口, 使用快捷键生成xml文件及SQL...

DemonsI
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部