文档章节

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

RainOrz
 RainOrz
发布于 2017/07/20 16:00
字数 372
阅读 38
收藏 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
粉丝 8
博文 134
码字总数 89112
作品 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多线程归纳

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

Eysolitude
2016/03/08
44
0
iOS开发多线程篇---GCD的介绍和简单使用

1.GCD的简介: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。而...

琳小兮
2015/03/05
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Android 通过DrawableInflater加载自定义Drawable

一、Drawable 在Android系统张,图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,因此系统提供了一个被称之为Drawable的类来进行绘制处理...

IamOkay
15分钟前
1
0
灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

yizhichao
21分钟前
1
0
Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
今天
7
0
DecimalFormat 类基本使用

/* * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度 * 0 表示如果位数不足则以 0 填充 * # 表示只要有可能就把数字拉上这个位置 * */ public static void main(String[] args){...

嘴角轻扬30
今天
4
0
This APT has Super Cow Powers.

在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有超级牛力 牛力是个什么梗? 则说明你的系统...

taadis
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部