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 ...
随机推荐
- xml和json格式输出
<?php class Response{ const JSON ='json'; /* * 按综合方式输出通信数据 * @param integer $ ...
- 查看,设置,设备的 竖屏-横屏模式 screen.orientation
<body> <div id="doc"></div> <div id="model"></div> ...
- ABP之展现层(导航菜单)
基本的增删改查已经粗糙的结束了,接下来就是要方便的展示了,也就是导航菜单.在Abp中已经对导航栏的设置进行了相应的封装(Abp.Application.Navigation),可以方便我们快速的将自己 ...
- ERP项目实施记录04
周二做了计划部门的需求调查,提到现有计划(一天计划)的准确率仅有60~70%,每天下来都有30%~40%不能达成. 计划部门提出的需求更多是基于Excel操作思路,要求未来的系统要有更多的" ...
- ELK之使用metricbeat收集系统数据及其他程序并生成可视化图表
将 Metricbeat 部署到您所有的 Linux.Windows 和 Mac 主机,并将它连接到 Elasticsearch 就大功告成啦:您可以获取系统级的 CPU 使用率.内存.文件系统.磁盘 ...
- PAT甲级1013-1014-1015
题目:1013 Battle Over Cities 思路:城市数也就1000, 对于每次询问暴力bfs一下看一下有多少连通块就行了.答案就是联通块数减一. #include<stdio.h&g ...
- 网关 整理 fastcgi wsgi
https://www.cnblogs.com/hzhtracy/p/4365938.html 网关协议学习:CGI.FastCGI.WSGI.uWSGI 一直对这四者的概念和区别很模糊,现在就特 ...
- php测试for/while/foreach循环速度对比
对比代码先行贴上,有疑问或者有不同见解的希望可以提出,大家共同进步: //-------------------------------------$k=0;$checkTime = ['for'=& ...
- LeetCode 104 Maximum Depth of Binary Tree 解题报告
题目要求 Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the ...
- MonkeyRunner_批处理执行py文件
新建bat文件,使用call调用monkeyrunner执行py脚本 @echo off echo begin testcase001 %time% %date%call monkeyrunner d ...