Day16-AFNetworking底层原理
AFNetworking 是基于 Apple 提供的 NSURLSession 和 NSURLConnection 封装的网络库(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
- 实现了 NSURLSessionDataDelegate、NSURLSessionTaskDelegate等代理方法
- 将代理方法中的回调统一到 block 中,便于使用者调用
2. 任务回调处理机制
AFNetworking 通过维护一个 NSMutableDictionary<NSNumber *, AFURLSessionManagerTaskDelegate *> 来管理每一个 NSURLSessionTask 的 delegate,保证每个任务的回调被正确分发。
| 1 | @property (readwrite, nonatomic, strong) NSMutableDictionary *mutableTaskDelegatesKeyedByTaskIdentifier; | 
当一个任务开始时,AF 会:
- 创建对应的 delegate(AFURLSessionManagerTaskDelegate)
- 保存到上面的字典中
- 当代理方法回调时,通过 taskIdentifier 查找对应 delegate 处理
三、AFHTTPSessionManager(HTTP 请求封装)
继承自 AFURLSessionManager,并进一步封装了 HTTP 请求方法:
- 提供了常见的 GET、POST、PUT、DELETE等方法
- 自动将请求参数序列化(使用 AFHTTPRequestSerializer)
- 自动解析响应数据(使用 AFJSONResponseSerializer、AFXMLParserResponseSerializer等)
示例:
| 1 | [self.manager GET:@"url" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) { | 
四、请求序列化器(AFURLRequestSerialization)
主要负责:
- 设置请求头(如 Content-Type、Authorization等)
- 参数编码(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 | [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { | 
七、线程安全设计
AFNetworking 使用 dispatch_queue_t 和 NSLock 保证线程安全:
- 对字典 mutableTaskDelegatesKeyedByTaskIdentifier的访问通过锁保护
- 使用 completionQueue/completionGroup控制回调在哪个线程执行
八、AFNetworking 与断点续传
AFNetworking 本身不直接封装断点续传逻辑,但它支持通过 NSURLSessionDownloadTask 实现断点续传:
- 利用 resumeData保存中断的数据
- 通过 downloadTaskWithResumeData:恢复下载任务
你可以自己封装逻辑,比如监听下载失败时 resumeData,保存后续再恢复。
总结
| 模块 | 说明 | 
|---|---|
| AFURLSessionManager | 对 NSURLSession的封装,统一任务管理和回调 | 
| AFHTTPSessionManager | 提供 HTTP 请求方法的封装 | 
| 请求序列化 | 设置请求头、参数编码等( AFHTTPRequestSerializer) | 
| 响应序列化 | 将 NSData转为对象(如 JSON/XML) | 
| 网络监控 | 基于 SCNetworkReachability监测网络状态 | 
| 并发处理 | 使用锁、队列保证线程安全 |