iOS 多网络请求同步并发
iOS中经常会用到多线程,在多线程中有一个线程组的概念(group),创建多个线程组任务,多组任务都完成之后,就会进入dispatch_group_notify队列中。
同时多线程中还有一个信号量的概念(semaphore),信号量常用的方法有3个:
dispatch_semaphore_create 创建一个semaphore
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号
执行dispatch_semaphore_create创建信号量并初始化信号值
dispatch_semaphore_signal 发送一个信号,信号量的信号值+1
dispatch_semaphore_wait 当信号量的值≤0时,执行等待,信号量的值>0时,则继续向下执行,并将信号量-1
在实际开发中经常会用到多网络请求并行,最后又需要统一处理请求结果这样的需求,这里就可以利用GCD的这些特点来完成。
//创建group
dispatch_group_t group = dispatch_group_create();
//创建GCD组
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//创建信号量 并初始化信号量值为0
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[HttpRequestUtil GET:Action_Home_Adv parameters:@{@"spaceId":@"1"} finished:^(AjaxResult *result) {
if (result.code == AjaxResultStateSuccess) {
}
dispatch_semaphore_signal(sema);
}];
//由于信号量初始化值为0,所有当第一次执行到这里的时候信号量值仍然为0,程序就开始在这里等待信号量变化,前面异步的网络请求结束后,执行了dispatch_semaphore_signal(sema)方法,信号量+1,这样,dispatch_semaphore_wait监听到信号量由0变为1后,跳出等待,并且结束当前group队列
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
});
当多个gcd_group都被执行完毕,所有的组都已经完成之后,根据GCD_Group的特点,会执行dispatch_group_notify这个队列
//把group_notify放在主队列中,这样可以在这个队列中刷新UI
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
});
整体的思路就是利用GCD通过dispatch_group + 信号量来实现的。
通过group把多个请求分组,然后依次完成每个请求,当所有请求都有请求完成 会进入group_notify中,同时利用semaphore信号量的特点确保每个group执行完毕后,里面的网络请求也是请求完成的,最终在group_notify中完成数据的处理和界面的刷新
iOS 多网络请求同步并发的更多相关文章
- iOS 处理多个网络请求的并发的情况
如何处理多个网络请求的并发的情况 一.概念 1.并发 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配 ...
- iOS面试题--网络--如何处理多个网络请求的并发的情况
如何处理多个网络请求的并发的情况 一.概念 1.并发 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配 ...
- ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)
当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的Cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你 ...
- iOS - NSURLConnection 网络请求
前言 @interface NSURLConnection : NSObject class NSURLConnection : NSObject DEPRECATED: The NSURLConne ...
- iOS - ASIHTTPRequest 网络请求
前言 使用 iOS SDK 中的 HTTP 网络请求 API,相当的复杂,调用很繁琐,ASIHTTPRequest 就是一个对 CFNetwork API 进行了封装,并且使用起来非常简单的一套 AP ...
- iOS - NSURLSession 网络请求
前言 NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0) @interface NSURLSession : NSObject @available(iOS ...
- iOS 原生网络请求(推荐使用AFNetWorking库)
. 同步GET请求 //第一步,创建URL NSURL *url = [NSURL URLWithString:@"http://api.hudong.com ...
- iOS开发网络请求——大文件的多线程断点下载
iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大 ...
- iOS - Alamofire 网络请求
前言 Alamofire 是 Swift 语言的 HTTP 网络开发工具包,相当于 Swift 实现 AFNetworking 版本.当然,AFNetworking 非常稳定,在 Mac OSX 与 ...
随机推荐
- 基于django rest framework的mock server实践
网上找了一下mock server的实现,发现python的基本都是基于flask来实现的,因最近在学django,就尝试用drf实现了下: A brief introduction of sui_m ...
- FZU-2271 X(Floyd)
Problem 2271 X Accept: 303 Submit: 1209Time Limit: 1500 mSec Memory Limit : 32768 KB Problem ...
- SQL 连表更新
现在数据如下: 需求如下: 要求 更新 Earnings 表中的Earnings字段 当 Table_2 KPI 大于等于1时 Earinings = KPI* 2000,否则等于 KPI* 1500 ...
- SQL Reverse函数
原文:SQL Reverse函数 Sql sever里面有个自带的reverse函数,这个函数的主要功能是把一个字符产反转.比如对于: select REVERSE('hello,world') 将得 ...
- 任务驱动,学习.NET开发系列第2篇------单词统计
一 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分人学习软件开发技术是通过看书,看视频,听老师上课的方式.这些方式有一个共同点即按知识点进行讲解.比如拿c#编程为例,首先是讲解大量的基础概念 ...
- js常用函数和常用技巧
学习和工作的过程中总结的干货,包括常用函数.常用js技巧.常用正则表达式.git笔记等.为刚接触前端的童鞋们提供一个简单的查询的途径,也以此来缅怀我的前端学习之路. PS:此文档,我会持续更新. Aj ...
- 彻底理解Java中的hashcode方法(转)
本文转自http://www.importnew.com/18851.html 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有 ...
- Java高级特性—并发包
1). java并发包介绍 JDK5.0 以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的, 主要包含原子量.并发集合.同步器.可 ...
- 2017.4.10 spring-ldap官方文档学习
官网:http://www.springframework.org/ldap 官方文档及例子(重要):http://docs.spring.io/spring-ldap/docs/2.1.0.RELE ...
- 转: java语法与ide级入门介绍 from: IBM dev
点评: 讲的比较初级,但是有教你使用ide (Eclipse) frrom:http://www.ibm.com/developerworks/java/tutorials/j-introtojava ...