美文网首页
(上部分)NSURLSession的最大并发 HTTPMaxim

(上部分)NSURLSession的最大并发 HTTPMaxim

作者: 空空小僧 | 来源:发表于2018-12-17 22:18 被阅读0次

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),可以复用链接通道,可以三次握手建立链接之后继续复用此通道

  1. 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,下图为官方文档对此属性的介绍:

image.png

默认配置下,iOS对于同一个IP服务器的并发最大为4,OS X为6。而如果你没有使用共享的Session,则可能会超过这个数。

代码举例:

image.png

然后经过测试和实践证明:

  • 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来再次增加并发呢? 为此,我进行了一个验证:
  1. 基于AFNetworking创建了2个manager,分别对应不同的config,通过打印manger的session实例,发现的确不是一个session,但是并发数量却没有按照我们想象的,各自持有一个并发数,而是如下:
  2. A B 为ephemeralSessionConfiguration 和defaultSessionConfiguration 混合,使用默认值的时候,
    按照顺序创建task,直到满足4个默认值,就停止了,
    测试使用demo: https://github.com/yangfangkuo/downLoadTest

下部分: https://www.jianshu.com/p/a8f1f7353e7f

相关文章

网友评论

      本文标题:(上部分)NSURLSession的最大并发 HTTPMaxim

      本文链接:https://www.haomeiwen.com/subject/fnqhkqtx.html