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 监测网络状态 |
并发处理 | 使用锁、队列保证线程安全 |