iOS 串行网络请求。。。待研究
nsurlsession 和 nsurlconnection 能实现吗? 手动实现的关键点在哪里?
我这里说的串行网络请求,指的是第一个网络请求不返回数据,第二个网络请求就不能开始。
AFNetworking 使用NSUrlConnection 系列函数实现串行网络请求的方法如下,本质是在AFURLConnectionOperation实现了响应方法,让网络请求内容返回后,再结束Operation,这样就实现了我们想要的串行请求。不用AFHTTPRequestOperationManager也是可以的,但是要自己建立一个queue.
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.operationQueue.maxConcurrentOperationCount = ;
AFNetworking中用NSUrlSession实现的方法就没有上面那么好用的串行下载方法了,虽然在代码中有以下code
[NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
这里也有一个quque,但是这个queue是NSURLSession的delegate的回调方法的queue,这个queue的
maxConcurrentOperationCount已经被赋值为1,目的是串行地处理各个task的delegate的回调,而不是串行地下载,几个task可能在同时下载,至于到底是几个在同时下载,应该是由系统看情况自动处理的。比如有以下代码:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
for(int i = ;i<;i++){
NSURLSessionDownloadTask *task2 = [session downloadTaskWithURL:[NSURL URLWithString:@"http://www.baidu.com"] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"current thread is %@",[NSThread currentThread]);
NSLog(@"==================================%d",i);
for(int i=;i<;i++){
NSLog(@"%d",i);
};
}];
[task2 resume];
}
那么 20个请求会同时发出,响应也被同时得到了,但是处理数据的回调的block是串行执行的(这是因为不指定queue的话,系统会自动建立一个serial queue)!
顺便看一下网络请求的截图印证一下:

如果我们的请求都来自一个host,也可以用
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.HTTPMaximumConnectionsPerHost = 1;
方法来实现我们想要的串行下载,但是注意,如果等待时间过长,(具体时间是多少???),这种方法可能产生网络超时的错误!所以这个设定HTTPMaximumConnectionsPerHost的方法不适用多个大型文件的下载。
iOS 串行网络请求。。。待研究的更多相关文章
- 使用 RxJava 进行嵌套串行网络请求的一种方法
需求 有这样一个列表数据,它包含了商店+订单的信息,获取订单列表时,订单实体中会包含商店的 ID,而列表显示时需要商店的名称和 logo,这时候就需要进行嵌套串行网络请求了. 关键词 flatMap ...
- iOS美丽约网络请求分析
网络请求分析html, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0px; padd ...
- 基于FPGA实现的高速串行交换模块实现方法研究
基于FPGA实现的高速串行交换模块实现方法研究 https://wenku.baidu.com/view/9a3d501a227916888486d7ed.html
- iOS基础之网络请求相关
1.AFNetwork二次封装方法一: #import <Foundation/Foundation.h> @interface BeeNetworkManager : NSObject ...
- ios编程之网络请求
网络请求有GET请求和POST请求,get和post实现的时候可以选择同步或者异步实现.看一个请求是GET还是POST就看网址后面有没有携带请求体. GET与POST 区别 1.get请求 请求的网 ...
- iOS中的网络请求 和 网络监测
1.网络监测 //根据主机名判断网络是否连接 Reachability *reach = [Reachability reachabilityWithHostName:@"www.baidu ...
- iOS开发之网络请求(基于AFNetworking的再封装)
最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服 ...
- ios中封装网络请求类
#import "JSNetWork.h" //asiHttpRequest #import "ASIFormDataRequest.h" //xml 的解析 ...
- iOS -读书笔记-网络请求
知道"3次握手"吗?突然想起这个词 什么是3次握手? TCP三次握手/四次挥手详解 这里是3次握手的详解 3次握手就是为了可靠的传送数据,TCP(什么是TCP呢?TCP就是一种可靠 ...
随机推荐
- SQLServer中获取特定表的所有列名
1.获取特定表的所有列名: Select Name FROM SysColumns Where id=Object_Id('tableName') 参考:http://blog.csdn.net/wu ...
- 【转】常用的shell脚本
from:http://blog.sina.com.cn/s/blog_4152a9f501013r6c.html 常用的shell脚本 (2012-10-10 22:09:07) 转载▼ 标签: 杂 ...
- 调整Linux磁盘分区的大小的方法
昨天数据入库时,一直报错,说磁盘满了,,df -h 一看,发现/目录下只有50G空间,已使用49G:我的程序和dbss都安装在/目录下,ftp到的数据放在/data下的一个子目录下,分解完的 ...
- Oracle卸载
用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,所以要想完全卸载Oracle就必须要直接将注册表清除. 步骤如下: 1. 开始->设置->控制面板-&g ...
- gdb调试core文件
本人最近正在学习调试技术,此处对栈溢出做一些总结. gdb的基本使用就不多扯了. 主要针对发行在外的release版本的软件出现问题时的调试. 一般来讲,查看堆栈就是使用bt,这个时候加上bt ful ...
- Swift3.0P1 语法指南——基本操作符
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- window 常用软件
参考链接: http://www.aiweibang.com/yuedu/721140.html http://www.aiweibang.com/yuedu/145263218.html 1.wox ...
- Aptana 中去掉“Missing semicolon”提醒
打开“窗口”下的“首选项” 然后找到“Aptana Studio”,在其下找到并点击Validation,在右侧窗口找到Javascript Syntax Validator,在下方的Options中 ...
- 为在韶大痛苦而不能用手机、Pad等上网的同志造福!
目标:共享咱们校园网,让更多的人或更多的设备冲浪去! 基本条件:一台带无线功能的笔记本,一个可以上网的账号与pwd,最好为Windows7以上的操作系统,如果是XP,则需要打个.net framewo ...
- BZOJ1251——序列终结者
给你一个数列,让你实现区间加上一个值,区间翻转,区间最大值 裸splay,懒标记一发即可 #include <cstdio> #include <cstdlib> #inclu ...