AFNetworking 3.0 源码阅读笔记(一)

前言

在完成 SDWebImage 的源码阅读后(可参见系列文章:SDWebImage 源码阅读笔记),我又将目光瞄向了大名鼎鼎的网络库 AFNetworking,不过为了能保证源码阅读的流畅性,不至于到时一脸懵逼,在正式开始之前,我又恶补了下网络相关的知识,可参见相关文章:从 NSURLConnection 到 NSURLSession《图解 HTTP》读书笔记

好啦,似乎万事具备,就让我们扬帆起航,开启 AFNetworking 源码阅读之旅吧!


概述

AFNetworking 官方介绍如下:

AFNetworking is a delightful networking library for iOS and Mac OS X. It’s built on top of the Foundation URL Loading System, extending the powerful high-level networking abstractions built into Cocoa. It has a modular architecture with well-designed, feature-rich APIs that are a joy to use.

一句话总结:AFNetworking 是一个在 iOS 和 Mac OS X 都令人喜爱的网络库,它是基于 Foundation URL Loading System 进行的一套封装,有着精心设计的模块化架构和丰富的 API 接口。


3.0 vs. 2.0

AFNetworking 依靠着开源社区的力量,仍在不断更新中,本系列文章阅读的版本为 3.1.0

为了迎合 iOS 新版本的升级,AFNetworking 在 3.0 版本中删除了基于 NSURLConnection API 的所有支持。目前 AFNetworking 2.0 官方已经不再提供支持了,其所依赖的 NSURLConnection 系列类也已经被苹果废弃了,意味着苹果官方也不再推荐。因此 AFNetworking 3.0 版本是目前开发的首选(需要兼容旧版本 iOS 的情况下除外)。

尽管 AFNetworking 对外提供的 API 变化不大,这里我们还是需要注意一下 AFNetworking 在 3.0 和 2.0 版本架构上的一个主要变化:

AFNetworking 3.0 以 Session 为中心,AFNetworking 2.0 以 Operation 为中心。

这种区别来源与它们下层的依赖,AFNetworking 3.0 依赖的较新的 NSURLSession API,AFNetworking 2.0 依赖于 NSURLConnectionNSOperation

Session 提供了一个较为中心的管理机制,可以通过配置 NSURLSessionConfiguration 来控制一系列请求。而 Operation 则提供了较为分散的管理方法,不同的 Operation 之间没有太大的联系,可以独自进行配置。

如果你对 NSURLConnectionNSURLSession 的概念不熟,建议不妨看下我之前的文章:从 NSURLConnection 到 NSURLSession 补补课:)

新设备要求

AFNetworking 3.0 正式支持 iOS 7+,Mac OS X 10.9+,watchOS 2+,tvOS 9 和 Xcode 7。如果你想在针对较旧版本的 SDK 项目中使用 AFNetworking,请检查 README 的兼容性信息。

NSURLConnection 的 API 已被废弃

AFNetworking 1.0 建立在 NSURLConnection 的基础 API 之上,AFNetworking 2.0 提供了选择使用 NSURLConnection 的基础 API 或者较新基于 NSURLSession 的 API 的选项。AFNetworking 3.0 现已是完全基于 NSURLSession 的 API,这降低了日后维护的负担,同时支持苹果增强关于 NSURLSession 提供的任何额外功能。由于 Xcode 7 中,NSURLConnection 的 API 已经正式被苹果弃用。虽然该 API 将继续运行,但将没有新功能将被添加,并且苹果已经通知所有基于网络的功能,以充分使 NSURLSession 向前发展。

AFNetworking 2.x 将继续接受严重的 bug 提交和提供安全补丁,但未来不会有新的功能被添加。Alamofire(Swift 下的网络请求)软件基金会建议,所有的项目迁移到基于 NSURLSession的 API。

废弃的类

以下的类已从 AFNetworking 3.0 中废弃:

  • AFURLConnectionOperation
  • AFHTTPRequestOperation
  • AFHTTPRequestOperationManager

修改的类

以下的类包含基于 NSURLConnection 的 API 的内部实现。他们已经被使用 NSURLSession 重构:

  • UIImageView+AFNetworking
  • UIWebView+AFNetworking
  • UIButton+AFNetworking

迁移

AFHTTPRequestOperationManager 核心代码

如果你以前使用 AFHTTPRequestOperationManager,你将需要迁移去使用 AFHTTPSessionManager。以下的类在两者过渡间并没有发生变化:

  • securityPolicy
  • requestSerializer
  • responseSerializer

AFHTTPRequestOperation 核心代码

NSURLConnection 对象不同,每个共享应用范围的设置如会话管理、缓存策略、Cookie 存储以及 URL 协议等,这些 NSURLSession 对象都可以单独进行配置。使用特定的配置来初始化会话,它可以发送任务来获取数据,并上传或下载文件。

在 AFNetworking 2.0 中,使用 AFHTTPRequestOperation,有可能创建一个没有额外开销的独立的网络请求来获取数据。NSURLSession 则需要更多的开销,为了获得所要请求的数据。

跟踪进程

AFNetworking 3.0 使用 NSProgress 来对 NSURLSessionTasks 进行跟踪。除了在上传/下载的任务中加入了对 block 的支持,AFURLSessionManager 还暴露了两个获得 NSProgress 对象的辅助方法:

  • uploadProgressForTask:
  • downloadProgressForTask:

UIKit 的迁移

图片下载已经被重构,以遵循 AlamofireImage 架构与新的 AFImageDownloader 类。这个类的图片下载职责的 delegate 是 UIButton 与 UIImageView 的 Category,并且提供了一些方法,在必要时可以自定义。在 Category 中,下载远程图片的实际方法并没有改变。

UIWebView 的 Category 被重构为使用 AFHTTPSessionManager 作为其网络请求。

UIAlertView 的 Category 被废弃

从 AFNetworking 3.0 后 UIAlertView 的 Category 因过时而被废弃。并且没有提供 UIAlertController Category 的计划,因为这是应用程序应处理的逻辑,而不是这个库。


补充

如果你对 AFNetworking 2.0 的实现细节感兴趣,在这里推荐大神 bang 的源码分析:AFNetworking2.0源码解析

在接下来的文章中,我们将正式开始 3.0 的探索:D


参考