AFNetworking 源码解析
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连接并不由上层控制,而是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 源码解析的更多相关文章
- iOS网络请求-AFNetworking源码解析
趁着端午节日,自己没有什么过多的安排,准备花4-5天左右,针对网络请求源码AFNetworking和YTKNetwork进行解析以及这两年多iOS实际开发经验(其实YTKNetwork也是对AFNet ...
- AFNetworking源码解析-https证书相关
本篇说说安全相关的AFSecurityPolicy模块,AFSecurityPolicy用于验证HTTPS请求的证书,先来看看HTTPS的原理和证书相关的几个问题. HTTPS HTTPS连接建立过程 ...
- 【原】AFNetworking源码阅读(五)
[原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- 【原】AFNetworking源码阅读(二)
[原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...
- AFNetworking源码简析
AFNetworking基本是苹果开发中网络请求库的标配,它是一个轻量级的网络库,专门针对iOS和OS X的网络应用设计,具有模块化的架构和丰富的APIs接口,功能强大并且使用简单,深受苹果应用开发人 ...
- iOS开发之Alamofire源码解析
今天博客中的Alamofire源码的版本是以3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是给本篇博客 ...
- AFNetworking源码的学习
忽略编译警告 AFNetworking源码中常常会出现忽略警告的代码,如下: 1 2 3 4 #pragma clang diagnostic push #pragma clang diagnosti ...
随机推荐
- Linux上强制踢出其他正在登录的用户
一.查看当前在线用户有几个 w命令 [root@pa1 nginx]#w 13:36:00 up 79 days, 23:50, 3 users, load average: 0.10, 0.07, ...
- PHP数组(数组正则表达式、数组、预定义数组)
正则表达式 1.替换 $s = "hello5world"; $s = preg_replace("/\d/","#",$s); echo ...
- python面向对象-三大特性
python面向对象编程三大特性 小结:前面我们说完了类和对象的关系,相信对类和对象的理解更加透彻..让我们一起去研究面向对象的三大特性吧.... 继承 1.什么继承? 在程序中继承就是事物之间的所属 ...
- PAT甲级1013-1014-1015
题目:1013 Battle Over Cities 思路:城市数也就1000, 对于每次询问暴力bfs一下看一下有多少连通块就行了.答案就是联通块数减一. #include<stdio.h&g ...
- [No0000F2]ip安全监视器
IPSec快速式策略 @echo off :again set num= set fastpolicyname= set issoft= set livetime= set fps= setlocal ...
- angular validation 使用总结
我由于制作登陆界面,用到了angular-validation,结合ng-cookies,实现记住账户密码的功能.文档是https://github.com/hueitan/angular-valid ...
- Java向服务端转身 系统平台所对应的机器语言 虚拟CPU的机器语言字节码 bytecode
小结: 1.虚拟CPU的模拟器:java虚拟机 JVM Java将虚拟机(VM)作为插件集成到浏览器中,将编译后的Java程序(Applet)在虚拟机上运行,这种技术 当初是为了增强浏览器的功能. J ...
- 如何辨别高潜牛人的六个方法,据说源自500强HR
如果你是一名领导,当老板派下来任务让你招人的时候,你有考虑过怎么招到合适的人么?今天,架构师米洛特意分享一篇优秀的网络文章,据说来自500强的HR,希望对你招人有所帮助. 如何识人是HR及管理者重要的 ...
- Chap4:探究操作系统[The Linux Command Line]
1 learn some more commands: (1) ls-List directory contents (2) file -Determine file type (3) less-Vi ...
- JDBC---Mysql(1)
使用MySQL需要导mysql-connector-java-5.1.7-bin.jar包 所有的java.sql.Driver实现类,都提供了static块,块内的代码就是把自己注册到DriverM ...