3.0 之后,就取消了NSOperation的控制。

因为根据Apple Developer Document的文档 https://developer.apple.com/documentation/foundation/nsurlsession/1411597-sessionwithconfiguration , 初始化NSURLSession的queue有以下的限制

queue

An operation queue for scheduling the delegate calls and completion handlers. The queue should be a serial queue, in order to ensure the correct ordering of callbacks. If nil, the session creates a serial operation queue for performing all delegate method calls and completion handler calls.

所以AFnetworking的里面的NSOperationQueue设置如下,达到为串行的效果,注意串行不保证为FIFO。

    self.operationQueue = [[NSOperationQueue alloc] init];
self.operationQueue.maxConcurrentOperationCount = ;

使用NSLock 来保护一个保存taskidentifier的NSMutableDicitionary.

使用 semphore 来返回正在执行的任务列表 ,利用URLSession里面的接口,形成了一个串行执行的顺序,https://developer.apple.com/documentation/foundation/nsurlsession/1411578-gettaskswithcompletionhandler

使用_cmd 巧妙的标示不同的函数入口,cmd在Objective-C的方法中表示当前方法的selector,正如同self表示当前方法调用的对象实例。

如果回包里面header 没有content-length表述数据有多大,那么就不能察觉网路请求的进度,一些接口与属性就失效。

使用+load swizzle 实现监听系统接口某些函数执行的功能,比如URLSession的resume, suspend, 但是由于iOS8,iOS7之间有些继承关系不一样,一些父类会执行名字相同的函数,所以用一个for循环一直替换函数实现,一直到父类没有对应的不同实现的函数为止。这个功能是经过多次艰辛的调试迭代出来的,请看过程https://github.com/AFNetworking/AFNetworking/pull/2702

使用Runloop,

SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);

[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes

选择使用了

根据2015的WWDC Session711,我们知道iOS9+NSURLSession开始正式支持HTTP /2,更加人性化API,更加快。

于是在HTTP 1.1中,出现了Connection: keep-alive。 这个优化选项,可以使得客户端和服务器端复用一个TCP连接,从而减小每次的网络请求时间底层是否重新创建新的tcp连接并不由上层控制,而是urlsession来决定。最大数设定为1时,由于并发数过小,因此只能选择唯一的连接通道。多设置几个并发数,是否复用,取决于当前同时的请求数,以及服务器给你的协商。

而如果不使用共享,则会每次都开启多个tcp管道,并且最终连接数量不可控 

NSURLRequestUseProtocolCachePolicy 这个是默认的缓存策略,缓存不存在,就请求服务器,缓存存在,会根据response中的Cache-Control字段判断下一步操作,如: Cache-Control字段为must-revalidata, 则询问服务端该数据是否有更新,无更新的话直接返回给用户缓存数据,若已更新,则请求服务端。

还有下载进度这个,必须获取回包的header,看里面是否content-length,这样URLSession才能计算出总的长度,才知道百分比。

如何防止循环引用?http://nelson.logdown.com/posts/2017/03/28/retain-cycle-in-afnetworking

當我們呼叫 invalidateSessionCancelingTasks: 函式,它會去呼叫 NSURLSession 的 invalidateAndCancel 或 finishTasksAndInvalidate。根據蘋果文件,呼叫這兩個函式之後,NSURLSession 才會斷開它與 delegate 的關聯。至此,才打破 retain cycle。

解法

有兩個解法,第一個就是如上所述,記得最後要呼叫 invalidateSessionCancelingTasks: 來結束任務。第二個就是把 AFHTTPSessionManager 寫成 singleton,這樣有 retain cycle 也無所謂了。

    self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
 





AFNetworking 源码解析的更多相关文章

  1. iOS网络请求-AFNetworking源码解析

    趁着端午节日,自己没有什么过多的安排,准备花4-5天左右,针对网络请求源码AFNetworking和YTKNetwork进行解析以及这两年多iOS实际开发经验(其实YTKNetwork也是对AFNet ...

  2. AFNetworking源码解析-https证书相关

    本篇说说安全相关的AFSecurityPolicy模块,AFSecurityPolicy用于验证HTTPS请求的证书,先来看看HTTPS的原理和证书相关的几个问题. HTTPS HTTPS连接建立过程 ...

  3. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  4. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  5. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

  6. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  7. AFNetworking源码简析

    AFNetworking基本是苹果开发中网络请求库的标配,它是一个轻量级的网络库,专门针对iOS和OS X的网络应用设计,具有模块化的架构和丰富的APIs接口,功能强大并且使用简单,深受苹果应用开发人 ...

  8. iOS开发之Alamofire源码解析

    今天博客中的Alamofire源码的版本是以3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是给本篇博客 ...

  9. AFNetworking源码的学习

    忽略编译警告 AFNetworking源码中常常会出现忽略警告的代码,如下: 1 2 3 4 #pragma clang diagnostic push #pragma clang diagnosti ...

随机推荐

  1. DB2 的代理 (agent)

    DB2 的代理 (agent) 是位于 DB2 服务器中的服务于应用程序请求的一些进程或线程.当有外部应用程序连接至 DB2 实例提出访问请求时,DB2 的代理就会被激活去应答这些请求.一般 DB2 ...

  2. 证书文件(pfx)读取时报 “指定的网络密码不正确”

    实际情况: 1.本地测试正确,发布到windows server 2003 iis6 可以正常运行 发布到 windows server 2008 上 II7就报 “指定的网络密码不正确” 日志报错为 ...

  3. ubuntu创建用户的两种方式

    ubuntu创建用户有两种方式: useradd和adduser 这两者,就像零件与产品的关系.useradd是DIY,需要自己调配,adduser是品牌机,拿来就能用. 对于创建一般用户来讲,use ...

  4. HDU 5985/nowcoder 207D - Lucky Coins - [概率题]

    题目链接:https://www.nowcoder.com/acm/contest/207/D 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5985 ...

  5. Srt字幕文件解析

    // // ViewController.m // 字幕解析 // // Created by admin on 2018/8/30. // Copyright © 2018年 admin. All ...

  6. [ovs] ovs开启日志debug

    如题 [root@vrouter1 ~]# ovs-appctl vlog/set netdev:file:dbg [root@vrouter1 ~]# ovs-appctl vlog/set net ...

  7. [elastic search][redis] 初试 ElasticSearch / redis

    现有项目组,工作需要. http://www.cnblogs.com/xing901022/p/4704319.html Elastic Search权威指南(中文版) https://es.xiao ...

  8. 斜率优化&单调性优化的相似性

    写了一道单调性优化发现 跟斜率优化很像,而且这道题目感觉质量非常的好. 其实斜率优化是基于单调性优化的,但是面对这道题 我竟然连单调性优化都不太会,尽管这个模型非常不好理解. 对于每道题 我都会打一个 ...

  9. TFA(Trace File Analyzer)的安装与使用(ORACLE版本12C)

    TFA是Oracle从11.2版本开始推出的一种类似diagcollection的一个oracle 集群日志收集器,而且TFA比diagcollection集中和自动化的诊断信息收集能力更强大.TFA ...

  10. JS实现倒计时(天数,时,分,秒)

    <!DOCTYPE html> <html> <head>   <meta charset="utf-8" >   <titl ...