解读AFNetworking4.0请求原理
简介
AFNetworking4.0 是对NSURLSession的封装,之前版本有NSURLConnection的封装,现在已经被废弃。
简单聊一下,为啥AF要弃用之前的NSURLConnection封装,改成对NSURLSession封装。
首先,NSURLSession是在iOS7.0的时候苹果推出来的。而NSURLSession又能支持Http2.0的。大家都知道Http是基于TCP协议的,早期的Http是短连接的,每次传输数据都需要重新连接,而每次连接的话需要进行三次握手,这就造成了资源以及时间的浪费。然后,在Http2.0的时候更新了Connection:keep-alive选项,这个优化项,使客户端与服务器在相同config的时候复用了同一个TCP连接,减少了每次请求的时间,提升了数据的传输速率。所以,AFNetworking也果断的改变成对NSURLSession的封装。
AFNetworking的五大模块
AFNetworking这个三方库主要包含以下五大模块:
- NSURLSession 网络通信模块
- Reachability 网络状态监听模块
- Security 网络通讯安全策略模块
- Serialization 序列化模块
- UIKit 对UIKit的扩展模块
下边主要讲的是在使用过程中,初始化过程以及请求方法内部实现过程
初始化
首先,AFHttpSessonManager继承自AFURLSessonManager。
当我们调用初始化方法[AFHTTPSessionManager manager],看代码里边都做了哪些事情呢?
- (instancetype)initWithBaseURL:(NSURL *)urlsessionConfiguration:(NSURLSessionConfiguration *)configuration
{self = [super initWithSessionConfiguration:configuration];if (!self) {return nil;}// Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expectedif ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) {url = [url URLByAppendingPathComponent:@""];}self.baseURL = url;self.requestSerializer = [AFHTTPRequestSerializer serializer];self.responseSerializer = [AFJSONResponseSerializer serializer];return self;
}
⚠️:虽然AF起名manager,但是,内部实现并不是一个单例,而是每次都会创建一个新的HttpSessonManager对象。
- 首先会先调用父类(AFURLSessonManager)的初始化方法。
- 给URL进行格式化处理,添加“/”
- 设置requestSerializer和responseSerializer
其中父类(AFURLSessonManager)的初始化方法主要设置了configuration,并且通过设置maxConcurrentOperationCount = 1设置了一个串行队列。以及解析的方式、网络状态的监听并创建了一个lock来保证线程安全等。
Request方法
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)methodURLString:(NSString *)URLStringparameters:(nullable id)parametersheaders:(nullable NSDictionary <NSString *, NSString *> *)headersuploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressdownloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgresssuccess:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))successfailure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure
{
NSError *serializationError = nil;NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];for (NSString *headerField in headers.keyEnumerator) {[request setValue:headers[headerField] forHTTPHeaderField:headerField];}if (serializationError) {if (failure) {dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{failure(nil, serializationError);});}return nil;}__block NSURLSessionDataTask *dataTask = nil;dataTask = [self dataTaskWithRequest:requestuploadProgress:uploadProgressdownloadProgress:downloadProgresscompletionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {if (error) {if (failure) {failure(dataTask, error);}} else {if (success) {success(dataTask, responseObject);}}}];return dataTask;
}
在这个方法里,AF返回了一个dataTask对象。大致又做了哪些事情呢?
先通过requestwithmethod方法获取一个request对象,获取这个对象的时候,通过请求方法的请求类型get、head、delete来判断是将参数直接拼接到url后边还是添加到body里。
然后通过方法dataTaskWithRequest方法,将上边的request生成一个task对象。其中addDelegateForDataTask中将task和delegate绑定到一起。每个task有相对应的代理。
在具体请求方法(post、get、delete、put等)里,对返回的task对象调用[dataTask resume];方法。
[dataTask resume]
这是进行网络请求的最后一步,AF在父类中,对系统的resume方法通过method_exchangeImplementations方法与自定义的af_resume方法进行交换。并在自定义的af_resume方法里对各种结果状态通过AFNSURLSessionTaskDidResumeNotification通知。
解读AFNetworking4.0请求原理相关推荐
- Tomcat7.0源码分析——请求原理分析(上)
前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多早期的J2EE项目,由程序 ...
- .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器...
1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.We ...
- 解秘 Node.js 单线程实现高并发请求原理,以及串联同步执行并发请求的方案
最近在做一个支持多进程请求的 Node 服务,要支持多并发请求,而且请求要按先后顺序串联同步执行返回结果. 对,这需求就是这么奇琶,业务场景也是那么奇琶. 需求是完成了,为了对 Node.js 高并发 ...
- Python 爬虫篇#笔记02# | 网页请求原理 和 抓取网页数据
目录 一. 网页请求原理 1.1 浏览网页的过程 1.2 统一资源定位符URL 1.3 计算机域名系统DNS 1.4 分析浏览器显示完整网页的过程 1.5 客户端THHP请求格式 1.6 服务端HTT ...
- Ajax异步请求原理和过程
Ajax异步请求原理和过程 1.什么是Ajax 2.AJAX创建异步对象XMLHttpRequest ( 考虑兼容性 ) 3.操作XMLHttpRequest 对象 1.什么是Ajax Ajax是一种 ...
- 英伟达公开课 | 如何突破Decoder性能瓶颈?揭秘FasterTransformer2.0的原理与应用,已开源...
位来 发自 凹非寺 量子位 报道 | 公众号 QbitAI 4月9日,英伟达x量子位分享了一期nlp线上课程,来自NVIDIA的GPU计算专家.FasterTransformer 2.0开发者之一的薛 ...
- Notification之 - Android5.0实现原理(二)
概述 前文讲解了Notification的构造,现在来讲讲notification的发送,以及公布前文留下的疑问(自定义view不论高度是多高,最后只能显示为64dp,why?) Notificati ...
- 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管
设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序). #inc ...
- internetreadfile读取数据长度为0_Go发起HTTP2.0请求流程分析(后篇)——标头压缩
阅读建议 这是HTTP2.0系列的最后一篇,笔者推荐阅读顺序如下: Go中的HTTP请求之--HTTP1.1请求流程分析 Go发起HTTP2.0请求流程分析(前篇) Go发起HTTP2.0请求流程分析 ...
最新文章
- 微博云原生技术的思考与实践
- python3 x和python2 x区别_Python3.x和Python2.x的区别
- Lightroom Classic CC8.2安装教程 IT宝盒 10-14 20:32
- 这样给面试官解释约瑟夫环问题的几种巧妙解法,面试官满意的笑了
- 一加10 Pro首发定制X轴线性马达:Top级超大体积 安卓阵营马达天花板
- 次表面散射材质_游戏开发者怎么做出以假乱真的画面效果?大气散射渲染了解一下...
- Python使用turtle绘制阴阳鱼图案
- ArcGIS Desktop软件安装和试用说明
- html 动画过度转换的用法,css(动画,过渡,转换)
- PMP考试有哪些技巧?
- 英睿达固态硬盘测试软件,高速读写,电竞必备 英睿达P5固态硬盘评测
- hdfs高可用与高拓展机制分析
- cad高程标注插件lisp_【源码】CAD高程转标高,CAD插件大全,小懒人CAD工具箱
- 【机器人学】牛顿-欧拉动力学方程迭代形式
- trove mysql 镜像_centos7下手动制作trove镜像
- 搭建自己的简易服务器(公网)
- pytorch基础-使用 TORCH.AUTOGRAD 进行自动微分(5)
- uni-app和vue什么关系?
- cvc-complex-type.2.4.d: 发现了以元素 'd:skin' 开头的无效内容。此处不应含有子元素。
- 渗透测试-SQL注入之sqlmap的使用方法及实战案例