AFNetworking(v3.1.0) 源码解析
https://juejin.im/entry/5bf626b2f265da614e2bb7dd
一、架构
AFNetworking 一共分为 5 个模块,2 个核心模块和 3 个辅助模块:
- Core
- NSURLSession(网络通信模块)
- AFURLSessionManager(封装 NSURLSession)
- AFHTTPSessionManager(继承自 AFURLSessionManager,实现了 HTTP 请求相关的配置)
- Serialization
- AFURLRequestSerialization(请求参数序列化)
- AFHTTPRequestSerializer
- AFJSONRequestSerializer
- AFPropertyListRequestSerializer
- AFURLResponseSerialization(验证返回数据和反序列化)
- AFHTTPResponseSerializer
- AFJSONResponseSerializer
- AFXMLParserResponseSerializer
- AFXMLDocumentResponseSerializer (Mac OS X)
- AFPropertyListResponseSerializer
- AFImageResponseSerializer
- AFCompoundResponseSerializer
- AFURLRequestSerialization(请求参数序列化)
- NSURLSession(网络通信模块)
- Additional Functionality
- Security(网络通信安全策略模块)
- Reachability(网络状态监听模块)
- UIKit(对 iOS 系统 UI 控件的扩展)
AFURLSessionManager 是 AFHTTPSessionManager 的父类, AFURLSessionManager 负责创建和管理 NSURLSession 的实例,管理 AFSecurityPolicy 和初始化 AFNetworkReachabilityManager,来保证请求的安全和查看网络连接情况,它有一个 AFJSONResponseSerializer 的实例来序列化 HTTP 响应。
AFHTTPSessionManager 有着自己的 AFHTTPRequestSerializer 和 AFJSONResponseSerializer 来管理请求和响应的序列化,同时依赖父类实现发出 HTTP 请求、管理 Session 这一核心功能。
1. 线程
一般调用 AFNetworking 的请求 API 时,都是在主线程,也是主队列。然后直到调用 NSURLSession 的 -resume
方法,一直都是在主线程。
在 AFURLSessionManager 的初始化方法中,设置了 NSURLSession 代理回调线程的最大并发数为 1,因为就像 NSURLSession 的 -sessionWithConfiguration:delegate:delegateQueue:
方法的官方文档中所说的那样,所有的代理方法回调都应该在一个串行队列中,因为只有这样才能保证代理方法的回调顺序。
NSURLSession 代理方法回调是异步的,所以收到回调时的线程模式是“异步+串行队列”,这个时候可以理解为处于回调线程。
收到代理回调后,接着在 AFURLSessionManagerTaskDelegate 的 -URLSession:task:didCompleteWithError:
方法中,异步切换到 processing queue 进行数据解析,数据解析完成后再异步回到主队列或者自定义队列。
AFNetworking(v3.1.0) 源码解析相关推荐
- solrlucene3.6.0源码解析(三)
solr索引操作(包括新增 更新 删除 提交 合并等)相关UML图如下 从上面的类图我们可以发现,其中体现了工厂方法模式及责任链模式的运用 UpdateRequestProcessor相当于责任链模式 ...
- Heritrix 3.1.0 源码解析(八)
本文接着分析存储CrawlURI curi的队列容器,最重要的是BdbWorkQueue类及BdbMultipleWorkQueues类 BdbWorkQueue类继承自抽象类WorkQueue,抽象 ...
- Heritrix 3.1.0 源码解析(六)
本文分析BdbFrontier对象的相关状态和方法 BdbFrontier类继承自WorkQueueFrontier类 WorkQueueFrontier类继承自AbstractFrontier类 ...
- Heritrix 3.1.0 源码解析(十一)
上文分析了Heritrix3.1.0系统是怎么添加CrawlURI curi对象的,那么在系统初始化的时候,是怎么载入CrawlURI curi种子的呢? 我们回顾前面的文章,在我们执行采集任务的la ...
- Heritrix 3.1.0 源码解析(三十四)
本文主要分析FetchFTP处理器,该处理器用于ftp文件的下载,该处理器的实现是通过封装commons-net-2.0.jar组件来实现ftp文件下载 在FetchFTP处理器里面定义了内部类Soc ...
- Heritrix 3.1.0 源码解析(十四)
我在分析BdbFrontier对象的void schedule(CrawlURI caURI).CrawlURI next() .void finished(CrawlURI cURI)方法是,其实还 ...
- 锚框、交并比和非极大值抑制(tf2.0源码解析)
锚框.交并比和非极大值抑制(tf2.0源码解析) 文章目录 锚框.交并比和非极大值抑制(tf2.0源码解析) 一.锚框生成 1.锚框的宽高 2.锚框的个数 3.注意点(★★★) 4.tf2.0代码 二 ...
- 基于8.0源码解析:startService 启动过程
基于8.0源码解析:startService 启动过程 首先看一张startService的图,心里有个大概的预估,跟Activity启动流程比,Service的启动稍微简单点,并且我把Service ...
- Android Glide 3.7.0 源码解析(八) , RecyclableBufferedInputStream 的 mark/reset 实现
个人博客传送门 一.mark / reset 的作用 Android Glide 3.7.0 源码解析(七) , 细说图形变换和解码有提到过RecyclableBufferedInputStream ...
最新文章
- 解决keepalived脑裂问题
- 工程建筑行业SAP整体解决方案
- 大对象简介+大对象的4种类型+lob类型的优点+lob的组成
- python中的列表是指针吗_Python中的指针——到底指什么(二)
- 自制“低奢内”CSS3注册表单,包含JS验证哦。请别嫌弃,好吗?。
- 怎样的项目才算是一个成功的项目 于病视神,未有形而除之
- Unity 3D学习笔记之一 界面介绍
- 男生给女生最牛B的告白
- FreeWheel容力:如何打造更高质效的技术团队
- 20个让Web Developer开发生涯更加轻松的工具
- 抓到的一次suse11 xen用libvirt连接的错误
- android开发(37) android使用android_serialport_api 操作串口,解决权限问题
- java中文件和流处理
- js 动态生成表格案例
- mysql全称量词_数据库整理(三) SQL基础
- 水星怎么设置网速最快_水星无线路由器怎么设置网速限制【设置方法】
- openwrt-mt7628 wds配置
- git(2)Git 基础
- python valueerror object2_Python使用json.loads 报错 ValueError: No JSON object could be decoded的解决方法...
- 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等
热门文章
- 金蝶和oracle ebs优缺点,金蝶,用友切换成EBS中存在的差异点
- 78. 子集(区分一下子集、子序列、子数组的概念)
- iPhone12基带确认,果粉放心
- 计算机软件开发行业前景
- 大数据可视化——dataV,Echarts,蚂蚁金服L7世界地图引入,数字翻牌器,全屏,自定义排名轮播表
- 安徽理工大学计算机研究生学院,计算机学院第二届研究生学术论坛圆满闭幕
- 1218:取石子游戏(swap)
- 前端开发_HTML5_CSS部分-动画特效(animation)
- javaee入门笔记2
- [ZUCC 英语周测]Quiz B-3-7