NSURLSession简单介绍:
NSURLSession在iOS7.0时被Apple提出后,它包括几个部分URLSessionConfiguration、URLSessionDelegate、URLSessionTask(组)、URLRequest、URLCache、
URLSessionConfiguration指定NSURLSession的配置信息。这些配置信息决定了NSURLSession的种类,HTTP的额外headers,请求的timeout时间,Cookie的接受策略等配置信息
NSURLSession对比NSURLConnect优势(简单介绍,不细致)
1.NSURLConnect每次进行HTTP请求的时候 ,都需要三次握手,四次挥手等操作,无法复用通道,
NSURLSession在HTTP1.1之后(Keep-Alive),可以复用链接通道,可以三次握手建立链接之后继续复用此通道
- NSURLSession针对下载/上传等复杂的网络操作提供了专门的解决方案,针对普通、上传和下载分别对应三种不同的网络请求任务:NSURLSessionDataTask, NSURLSessionUploadTask和NSURLSessionDownloadTask.
3.下载任务不需要内存拼接data,NSURLSession创建本地临时文件,写到临时文件,优化内存
4.其他不详细介绍,不是本文重点
URLSessionConfiguration介绍
学习NSURLSession的过程中,NSURLSession的配置分为三种类型,分别为
工作模式分为下面三种:
//普通模式(default):可以使用缓存 (摘抄介绍https://www.cnblogs.com/zanglitao/p/4082334.html)
+ (NSURLSessionConfiguration *)defaultSessionConfiguration;
//瞬时模式(ephemeral):不使用缓存
+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration;
//后台模式(background):当按下home键后仍然可以在后台进行上传下载操作,需要通过唯一的identity标示
+ (NSURLSessionConfiguration *)backgroundSessionConfiguration:(NSString *)identifier;
本文尤其介绍一下URLSessionConfiguration属性中的HTTPMaximumConnectionsPerHost,下图为官方文档对此属性的介绍:
默认配置下,iOS对于同一个IP服务器的并发最大为4,OS X为6。而如果你没有使用共享的Session,则可能会超过这个数。
代码举例:
然后经过测试和实践证明:
NSURLSessionConfiguration==defaultSessionConfiguration
如果用户没有设置HTTPMaximumConnectionsPerHost的值,那么iOS系统的最大并发数 最大值如文档所说,的确是4(OSX 未验证),如果用户设置了最大并发数,则按照用户设置的最大并发数执行(我设置的最大20,最小为1,均可以执行)NSURLSessionConfiguration==ephemeralSessionConfiguration
和defaultSessionConfiguration效果一样,没有感觉到差别NSURLSessionConfiguration==backgroundSessionConfiguration
与上面2种不同,发现默认值不同,在iOS10 系统上最大并发为3,在iOS12系统上为6,其他系统未验证(有同学持有不同系统的设备可以评论一下 我补上,取之于民用之于民),可以调低并发,但是设置超过默认值的并发,系统并不会执行,仍按照系统默认的最大并发执行,其他任务等待
补充: iOS9 系统 后台并发是3 提供人: 继刚大神
ps: 请注意后台模式的时候,NSURLSession任务创建的延时问题 (苹果官方论坛的回复): https://forums.developer.apple.com/thread/14854
其他想法:
-
如果我们在一个网络请求并发很多的app内,共用一个session,且未设置最大并发数的时候,尤其是包含一些请求响应时间不给力的请求(甚至说使用下载任务),可能会影响我们的其他的网络请求,这个时候,可以通过设置最大并发数来增加并发数(讨论的是一个服务器域名的 ),
但是是否可以通过新建一个session来再次增加并发呢? 为此,我进行了一个验证:
- 基于AFNetworking创建了2个manager,分别对应不同的config,通过打印manger的session实例,发现的确不是一个session,但是并发数量却没有按照我们想象的,各自持有一个并发数,而是如下:
- A B 为ephemeralSessionConfiguration 和defaultSessionConfiguration 混合,使用默认值的时候,
按照顺序创建task,直到满足4个默认值,就停止了,
测试使用demo: https://github.com/yangfangkuo/downLoadTest