简介

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对象。

  1. 首先会先调用父类(AFURLSessonManager)的初始化方法。
  2. 给URL进行格式化处理,添加“/”
  3. 设置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对象。大致又做了哪些事情呢?

  1. 先通过requestwithmethod方法获取一个request对象,获取这个对象的时候,通过请求方法的请求类型get、head、delete来判断是将参数直接拼接到url后边还是添加到body里。

  2. 然后通过方法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请求原理相关推荐

  1. Tomcat7.0源码分析——请求原理分析(上)

    前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多早期的J2EE项目,由程序 ...

  2. .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器...

    1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.We ...

  3. 解秘 Node.js 单线程实现高并发请求原理,以及串联同步执行并发请求的方案

    最近在做一个支持多进程请求的 Node 服务,要支持多并发请求,而且请求要按先后顺序串联同步执行返回结果. 对,这需求就是这么奇琶,业务场景也是那么奇琶. 需求是完成了,为了对 Node.js 高并发 ...

  4. Python 爬虫篇#笔记02# | 网页请求原理 和 抓取网页数据

    目录 一. 网页请求原理 1.1 浏览网页的过程 1.2 统一资源定位符URL 1.3 计算机域名系统DNS 1.4 分析浏览器显示完整网页的过程 1.5 客户端THHP请求格式 1.6 服务端HTT ...

  5. Ajax异步请求原理和过程

    Ajax异步请求原理和过程 1.什么是Ajax 2.AJAX创建异步对象XMLHttpRequest ( 考虑兼容性 ) 3.操作XMLHttpRequest 对象 1.什么是Ajax Ajax是一种 ...

  6. 英伟达公开课 | 如何突破Decoder性能瓶颈?揭秘FasterTransformer2.0的原理与应用,已开源...

    位来 发自 凹非寺 量子位 报道 | 公众号 QbitAI 4月9日,英伟达x量子位分享了一期nlp线上课程,来自NVIDIA的GPU计算专家.FasterTransformer 2.0开发者之一的薛 ...

  7. Notification之 - Android5.0实现原理(二)

    概述 前文讲解了Notification的构造,现在来讲讲notification的发送,以及公布前文留下的疑问(自定义view不论高度是多高,最后只能显示为64dp,why?) Notificati ...

  8. 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管

    设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序). #inc ...

  9. internetreadfile读取数据长度为0_Go发起HTTP2.0请求流程分析(后篇)——标头压缩

    阅读建议 这是HTTP2.0系列的最后一篇,笔者推荐阅读顺序如下: Go中的HTTP请求之--HTTP1.1请求流程分析 Go发起HTTP2.0请求流程分析(前篇) Go发起HTTP2.0请求流程分析 ...

最新文章

  1. 微博云原生技术的思考与实践
  2. python3 x和python2 x区别_Python3.x和Python2.x的区别
  3. Lightroom Classic CC8.2安装教程 IT宝盒 10-14 20:32
  4. 这样给面试官解释约瑟夫环问题的几种巧妙解法,面试官满意的笑了
  5. 一加10 Pro首发定制X轴线性马达:Top级超大体积 安卓阵营马达天花板
  6. 次表面散射材质_游戏开发者怎么做出以假乱真的画面效果?大气散射渲染了解一下...
  7. Python使用turtle绘制阴阳鱼图案
  8. ArcGIS Desktop软件安装和试用说明
  9. html 动画过度转换的用法,css(动画,过渡,转换)
  10. PMP考试有哪些技巧?
  11. 英睿达固态硬盘测试软件,高速读写,电竞必备 英睿达P5固态硬盘评测
  12. hdfs高可用与高拓展机制分析
  13. cad高程标注插件lisp_【源码】CAD高程转标高,CAD插件大全,小懒人CAD工具箱
  14. 【机器人学】牛顿-欧拉动力学方程迭代形式
  15. trove mysql 镜像_centos7下手动制作trove镜像
  16. 搭建自己的简易服务器(公网)
  17. pytorch基础-使用 TORCH.AUTOGRAD 进行自动微分(5)
  18. uni-app和vue什么关系?
  19. cvc-complex-type.2.4.d: 发现了以元素 'd:skin' 开头的无效内容。此处不应含有子元素。
  20. 渗透测试-SQL注入之sqlmap的使用方法及实战案例

热门文章

  1. js(EcamaScript)
  2. Phong与Blinn-Phong
  3. MySQL--函数--使用/示例
  4. 利用python画梯形图案例
  5. ping命令TTL的意思
  6. 微博登录显示服务器解析失败怎么办,微博air登录失败, air无法登录的原因 -电脑资料...
  7. centos7安装pip
  8. 保护模式(四)长调用与短调用 调用门
  9. JVM虚拟机-----垃圾回收相关概念
  10. 页面生命周期:DOMContentLoaded, load, beforeunload, unload解析