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
  • 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) 源码解析相关推荐

  1. solrlucene3.6.0源码解析(三)

    solr索引操作(包括新增 更新 删除 提交 合并等)相关UML图如下 从上面的类图我们可以发现,其中体现了工厂方法模式及责任链模式的运用 UpdateRequestProcessor相当于责任链模式 ...

  2. Heritrix 3.1.0 源码解析(八)

    本文接着分析存储CrawlURI curi的队列容器,最重要的是BdbWorkQueue类及BdbMultipleWorkQueues类 BdbWorkQueue类继承自抽象类WorkQueue,抽象 ...

  3. Heritrix 3.1.0 源码解析(六)

    本文分析BdbFrontier对象的相关状态和方法 BdbFrontier类继承自WorkQueueFrontier类   WorkQueueFrontier类继承自AbstractFrontier类 ...

  4. Heritrix 3.1.0 源码解析(十一)

    上文分析了Heritrix3.1.0系统是怎么添加CrawlURI curi对象的,那么在系统初始化的时候,是怎么载入CrawlURI curi种子的呢? 我们回顾前面的文章,在我们执行采集任务的la ...

  5. Heritrix 3.1.0 源码解析(三十四)

    本文主要分析FetchFTP处理器,该处理器用于ftp文件的下载,该处理器的实现是通过封装commons-net-2.0.jar组件来实现ftp文件下载 在FetchFTP处理器里面定义了内部类Soc ...

  6. Heritrix 3.1.0 源码解析(十四)

    我在分析BdbFrontier对象的void schedule(CrawlURI caURI).CrawlURI next() .void finished(CrawlURI cURI)方法是,其实还 ...

  7. 锚框、交并比和非极大值抑制(tf2.0源码解析)

    锚框.交并比和非极大值抑制(tf2.0源码解析) 文章目录 锚框.交并比和非极大值抑制(tf2.0源码解析) 一.锚框生成 1.锚框的宽高 2.锚框的个数 3.注意点(★★★) 4.tf2.0代码 二 ...

  8. 基于8.0源码解析:startService 启动过程

    基于8.0源码解析:startService 启动过程 首先看一张startService的图,心里有个大概的预估,跟Activity启动流程比,Service的启动稍微简单点,并且我把Service ...

  9. Android Glide 3.7.0 源码解析(八) , RecyclableBufferedInputStream 的 mark/reset 实现

    个人博客传送门 一.mark / reset 的作用 Android Glide 3.7.0 源码解析(七) , 细说图形变换和解码有提到过RecyclableBufferedInputStream ...

最新文章

  1. 解决keepalived脑裂问题
  2. 工程建筑行业SAP整体解决方案
  3. 大对象简介+大对象的4种类型+lob类型的优点+lob的组成
  4. python中的列表是指针吗_Python中的指针——到底指什么(二)
  5. 自制“低奢内”CSS3注册表单,包含JS验证哦。请别嫌弃,好吗?。
  6. 怎样的项目才算是一个成功的项目 于病视神,未有形而除之
  7. Unity 3D学习笔记之一 界面介绍
  8. 男生给女生最牛B的告白
  9. FreeWheel容力:如何打造更高质效的技术团队
  10. 20个让Web Developer开发生涯更加轻松的工具
  11. 抓到的一次suse11 xen用libvirt连接的错误
  12. android开发(37) android使用android_serialport_api 操作串口,解决权限问题
  13. java中文件和流处理
  14. js 动态生成表格案例
  15. mysql全称量词_数据库整理(三) SQL基础
  16. 水星怎么设置网速最快_水星无线路由器怎么设置网速限制【设置方法】
  17. openwrt-mt7628 wds配置
  18. git(2)Git 基础
  19. python valueerror object2_Python使用json.loads 报错 ValueError: No JSON object could be decoded的解决方法...
  20. 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等

热门文章

  1. 金蝶和oracle ebs优缺点,金蝶,用友切换成EBS中存在的差异点
  2. 78. 子集(区分一下子集、子序列、子数组的概念)
  3. iPhone12基带确认,果粉放心
  4. 计算机软件开发行业前景
  5. 大数据可视化——dataV,Echarts,蚂蚁金服L7世界地图引入,数字翻牌器,全屏,自定义排名轮播表
  6. 安徽理工大学计算机研究生学院,计算机学院第二届研究生学术论坛圆满闭幕
  7. 1218:取石子游戏(swap)
  8. 前端开发_HTML5_CSS部分-动画特效(animation)
  9. javaee入门笔记2
  10. [ZUCC 英语周测]Quiz B-3-7