Day16-AFNetworking底层原理

YVTU

AFNetworking 是基于 Apple 提供的 NSURLSessionNSURLConnection 封装的网络库(AFNetworking 3.0 以后完全基于 NSURLSession),它对网络请求、JSON/XML 解析、文件上传下载、网络监测等功能做了封装,使 iOS 开发者能够更方便地处理网络通信。

一、AFNetworking 架构总览

AFNetworking 核心组件包括:

  • AFURLSessionManager:对 NSURLSession 的封装,处理请求任务和回调
  • AFHTTPSessionManager:对 AFURLSessionManager 进一步封装,专注于 HTTP 请求
  • AFNetworkReachabilityManager:网络状态监测
  • AFURLRequestSerialization:请求序列化(如设置请求头、参数编码)
  • AFURLResponseSerialization:响应反序列化(如 JSON/XML 的解析)

二、AFURLSessionManager(核心类)

1. NSURLSession 的封装

AFNetworking 的请求是基于 NSURLSession 实现的,内部通过以下方式处理:

  • 创建 NSURLSession 对象,并设置 delegateQueue
  • 实现了 NSURLSessionDataDelegateNSURLSessionTaskDelegate 等代理方法
  • 将代理方法中的回调统一到 block 中,便于使用者调用

2. 任务回调处理机制

AFNetworking 通过维护一个 NSMutableDictionary<NSNumber *, AFURLSessionManagerTaskDelegate *> 来管理每一个 NSURLSessionTask 的 delegate,保证每个任务的回调被正确分发。

1
@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableTaskDelegatesKeyedByTaskIdentifier;

当一个任务开始时,AF 会:

  • 创建对应的 delegate(AFURLSessionManagerTaskDelegate
  • 保存到上面的字典中
  • 当代理方法回调时,通过 taskIdentifier 查找对应 delegate 处理

三、AFHTTPSessionManager(HTTP 请求封装)

继承自 AFURLSessionManager,并进一步封装了 HTTP 请求方法:

  • 提供了常见的 GETPOSTPUTDELETE 等方法
  • 自动将请求参数序列化(使用 AFHTTPRequestSerializer
  • 自动解析响应数据(使用 AFJSONResponseSerializerAFXMLParserResponseSerializer 等)

示例:

1
2
3
4
5
[self.manager GET:@"url" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
// 处理成功
} failure:^(NSURLSessionDataTask *task, NSError *error) {
// 处理失败
}];

四、请求序列化器(AFURLRequestSerialization)

主要负责:

  • 设置请求头(如 Content-TypeAuthorization 等)
  • 参数编码(query string 编码、JSON 编码等)
  • 构建 multipart/form-data 请求体(文件上传)

其核心类有:

  • AFHTTPRequestSerializer
  • AFJSONRequestSerializer
  • AFPropertyListRequestSerializer

五、响应序列化器(AFURLResponseSerialization)

主要负责将返回的原始 NSData 转换为可用的对象,比如:

  • JSON → NSDictionary / NSArray
  • XML → NSXMLParser
  • Image → UIImage

其核心类有:

  • AFJSONResponseSerializer
  • AFXMLParserResponseSerializer
  • AFImageResponseSerializer

通过设置 AFURLSessionManager.responseSerializer 来决定如何解析响应数据。

六、网络状态监控(AFNetworkReachabilityManager)

底层基于 SystemConfiguration.framework 中的 SCNetworkReachability 实现:

  • 可以监控 WiFi、蜂窝网络的变化
  • 通过 block 回调形式告知外部状态变化
1
2
3
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// 网络状态发生变化
}];

七、线程安全设计

AFNetworking 使用 dispatch_queue_tNSLock 保证线程安全:

  • 对字典 mutableTaskDelegatesKeyedByTaskIdentifier 的访问通过锁保护
  • 使用 completionQueue / completionGroup 控制回调在哪个线程执行

八、AFNetworking 与断点续传

AFNetworking 本身不直接封装断点续传逻辑,但它支持通过 NSURLSessionDownloadTask 实现断点续传:

  • 利用 resumeData 保存中断的数据
  • 通过 downloadTaskWithResumeData: 恢复下载任务

你可以自己封装逻辑,比如监听下载失败时 resumeData,保存后续再恢复。

总结

模块 说明
AFURLSessionManager NSURLSession 的封装,统一任务管理和回调
AFHTTPSessionManager 提供 HTTP 请求方法的封装
请求序列化 设置请求头、参数编码等(AFHTTPRequestSerializer
响应序列化 NSData 转为对象(如 JSON/XML)
网络监控 基于 SCNetworkReachability 监测网络状态
并发处理 使用锁、队列保证线程安全