GCD实现多个网络请求同步执行

1.dispatch_group_async、dispatch_group_t与dispatch_group_notify 再配合dispatch_group_enter(group)和dispatch_group_leave(group)两个函数一起来使用,这样才能实现我们想要的最终效果。

2.dispatch_group_enter(dispatch_group_t group);

参数group不能为空,在异步任务开始前调用。它明确的表明了一个block被加入到了队列组group中,此时group中的任务的引用计数会加1(类似于OC的内存管理),dispatch_group_enter(group)必须与dispatch_group_leave(group)配对使用,它们可以在使用dispatch_group_async时帮助你合理的管理队列组中任务的引用计数的增加与减少。

3.dispatch_group_leave(dispatch_group_t group);

参数group不能为空,在异步任务成功返回后调用。它明确的表明了队列组里的一个block已经执行完成,队列组中的任务的引用计数会减1,它必须与dispatch_group_enter(group)配对使用,dispatch_group_leave(group)的调用次数不能多于dispatch_group_enter(group)的调用次数。

当队列组里的任务的引用计数等于0时,会调用dispatch_group_notify函数。具体代码实现如下:

@property(nonatomic,strong) dispatch_group_t disGroup;

- (void)requestDatas {

dispatch_queue_tqueue =          dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_group_enter(self.disGroup);

dispatch_group_enter(self.disGroup);

dispatch_group_enter(self.disGroup);

dispatch_group_async(self.disGroup, queue, ^{

[self requestHomeWorks];

});

dispatch_group_async(self.disGroup, queue, ^{

[self requestHomeBanner];

});

dispatch_group_async(self.disGroup, queue, ^{

[self requestHomeAdvInfos];

});

dispatch_group_notify(self.disGroup, dispatch_get_main_queue(), ^{

NSLog(@"4");

[self.collectionView reloadData];

});

}

- (void)requestHomeWorks {

[[SFAPIManager sharedManager] requestDataWithPath:kHomeWorksPath params:nil completeBlock:^(id result,NSError *error) {

NSLog(@"1");

dispatch_group_leave(self.disGroup);

}];

}

原文地址:https://www.cnblogs.com/zhengweifang/p/11447332.html

时间: 2024-10-22 01:52:38

GCD实现多个网络请求同步执行的相关文章

GCD-两个网络请求同步问题

在网络请求的时候有时有这种需求 两个接口请求数据,然后我们才能做最后的数据处理.但是因为网络请求是移步的 .我们并不知道什么时候两个请求完成 . 通常面对这样的需求会自然的想到 多线程 啊 .表现真正的技术的时刻来啦,可以使用 group 队列啊 .等队列中的请求任务都完成 ,在通知主线程处理汇总数据嘛 . 今天我也是这么写的,但是发现主线程并没有等到队列中的分线程网络请求bock回调就返回了 .我给block回调之前打印,确实是队列中的任务都打印之后,才返回的主线程 .那么问题在哪里 ? 网络

GCD网络多线程---同步执行,异步执行,串行队列,并行队列

总结:同步(不管是串行还是并行)----不开辟子线程 异步(不管是串行还是并行)----开辟子线程 GCD: dispatch queue 主线程的main queue 并行队列 global dispatch queue 串行队列serial queues 一般用于按顺序同步访问 #pragma mark - 加载多线程 - (void) _loadMutil { //GCD基于C语言 //1.主对列:(串行队列) dispatch_queue_t mainQueue=dispatch_get

IOS网络请求(同步GET,同步POST,异步GET,异步POST)

1.     同步GET请求     //第一步,创建URL     NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];          //第二步,通过URL创建网络请求     NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProt

带你一步步剖析Retrofit 源码解析:一款基于 OkHttp 实现的网络请求框架

OkHttp与Retrofit 的区别与联系是怎样的? 参考答案:OkHttp和Retrofit都是目前流行网络开源框架 封装不同:Retrofit封装了具体的请求,线程切换以及数据转换.retrofit通过使用代理,外观,策略模式对okhttp进行了封装OkHttp 是基于Http协议封装的一套请求客户端 职责不同:Retrofit主要负责应用层面的封装,面向开发者,方便使用,比如请求参数,响应数据的处理,错误处理等等.OkHttp主要负责socket部分的优化与封装,比如网络访问,多路复用,

Android基础学习【历史流程重走】 ---- 网络请求(四)

一.网络请求 移动软件及APP实现主要在于本地功能交互的实现与数据的展示,且数据常为移动软件的核心.数据常源自于 服务器,网络数据交互则扮演十分重要的角色. 二.网络情形考量 网络请求在数据交互中扮演重要角色.因其流程的特殊性,存有多种情形需要考虑. 1,返回值情形 接口崩溃,返回异常情形:以及接口正确抛出异常的返回 接口返回内容为空,或者状态正常,可用数据部分为空: 接口正常返回数据,解析数据出现错误: 2,网络请求执行过程 执行开始前:提示网络请求正在执行,给予用户良好的反馈,屏蔽用户的其他

fetch网络请求 get 和 post

//在React Native中,使用fetch实现网络请求 /* fetch 是一个封装程度更高的网络API, 使用了Promise* Promise 是异步编程的一种解决方案* Promise 对象代表一个异步操作,有三种状态:Pending(进行中) Resolved(已完成) Rejected(已失效)** Promise 实例生成以后,可以分别制定'完成' 和'失败'状态的回调函数,实现方式:链式调用方法** 语法:* fetch(参数)* .then(完成的回调函数)* .catch

多个网络请求成功返回再执行另外任务的思路分析(iOS)

前言 今天我们来讨论一个经常出现的需求场景,也是一个老话题.在开发中我们往往会遇到需要进行多个网络请求,并且需要多个网络请求成功返回后再做其他事的场景.比如同一个界面显示的内容需要用到两个网络接口,而需求又希望成功返回两个接口的数据再进行页面展示:又比如喜欢挖坑的后台同学就只提供了返回一条数据的接口,但需求却希望我们在一个界面同时显示几条数据的情况. 正题 我们不讨论什么执行完一个请求再执行一个这种串行的低效率方法,以下分析都是在异步的基础上进行的.废话少说,直奔正题!先上个网络请求的模拟代码.

iOS 网络与多线程--4.同步Post方式的网络请求

通过Post请求方式,同步获取网络数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据 在ViewController.m文件内的viewDidLoad函数添加一下测试代码 1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 // Do any additional setup after loading the view, typically from a nib. 4 5 // 1.建立一个网址对象,指定请求数据的网址 6 NSURL

UI 网络请求(同步GET,同步POST,异步GET,异步POST)具体操作

1 #import "MainViewController.h" 2 3 @interface MainViewController ()<NSURLConnectionDataDelegate> 4 5 @property (nonatomic, retain)UIImageView *imageView; 6 7 @property (nonatomic, retain)NSMutableData *data;// 可变数据 Data 用于拼接每次接受来的数据块 8 @