AFN 底层原理剖析(二)---AFHTTPSessionMan
上一篇文章我们主要讲解了 URLSession 的使用. 使用非常简单. 不会的请务必先熟悉上一篇文章.
其实我看过网上很多 AFN 讲底层的文章, 在我没有去看源码的时候,我的第一感觉是懵的. 所以这次我希望用自己的话来描述, 希望大家能看的懂在讲什么, 尽力!
AFN主要的类.png从上面可以看出一共有以下几个类,也不多,每个类的职责非常明确,浅显易懂.大牛代码,绝不拖泥带水
AFHTTPSessionManager //http请求管理类
AFNetworkReachabilityManager //网络监听者
AFSecurityPolicy //网络安全工具类
AFURLRequestSerialization //请求序列化器
AFURLResponseSerialization //响应序列化器
AFURLSessionManager //Session 管理者
先看一下 AFN 如何发起一个网络请求
[[AFAppDotNetAPIClient sharedClient] GET:@"stream/0/posts/stream/global" parameters:nil headers: nil progress:nil success:^(NSURLSessionDataTask * __unused task, id JSON) {
NSArray *postsFromResponse = [JSON valueForKeyPath:@"data"];
} failure:^(NSURLSessionDataTask *__unused task, NSError *error) {
}]
@interface AFAppDotNetAPIClient : AFHTTPSessionManager
从上面的代码可以看出AFAppDotNetAPIClient 继承于AFHTTPSessionManager. 也就是说AFHTTPSessionManager 是一个非常重要的类.主要的方法属性看(AFHTTPSessionManager.png),已经非常清晰明了了. 虽然东西很多,但是分类之后很清晰明了
AFHTTPSessionManager.png
AFHTTPSessionManager这个类要做的事情就是统筹全局, 用它来管理所有的东西.包括网络请求, session的配置,网络请求等等
1: 我们发起网络请求的时候 有各种各样的请求方式, 比如 get,post,put 等等, 那么它封装了相关的所有的方法
- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
parameters:(nullable id)parameters
headers:(nullable NSDictionary <NSString *, NSString *> *)headers
progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(nullable id)parameters
headers:(nullable NSDictionary <NSString *, NSString *> *)headers
progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
- (nullable NSURLSessionDataTask *)PUT:(NSString *)URLString
parameters:(nullable id)parameters
headers:(nullable NSDictionary <NSString *, NSString *> *)headers
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
- (nullable NSURLSessionDataTask *)PATCH:(NSString *)URLString
parameters:(nullable id)parameters
headers:(nullable NSDictionary <NSString *, NSString *> *)headers
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
等等.... 需要看完的请看源码
2: 发起网络请求的时候总是避免不了传参. 所以它加入了一个请求序列化器AFURLResponseSerialization, 用于确定传参的格式. 这是一个协议, AFN 提供的请求序列化器AFJSONResponseSerializer(json 解析器),AFXMLParserResponseSerializer(XML 解析器),AFHTTPResponseSerializer(万能解析器,除 JSON和 XML 之外的数据,直接返回二进制)都遵循这个协议
self.requestSerializer = [AFHTTPRequestSerializer serializer];//可更改成自己需要的解析器
3: 发起网络请求之后 拿到数据之后我们需要处理成自己想要的格式. 它又加入了响应序列化器AFURLRequestSerialization. 用于确定我们拿到参数的格式.这是一个协议.AFN 提供的响应序列化器-AFJSONRequestSerializer(上传的数据转换成JSON格式),AFHTTPRequestSerializer(序列化工具) 都遵循这个协议
self.responseSerializer = [AFJSONResponseSerializer serializer];//可更改成自己需要的解析器
**4: 发起网络请求总是会涉及到安全问题, 它就提供了一AFSecurityPolicy(网络安全工具类) **
5: 我们知道 AFN 的底层是基于 URLSession 的. 最底层都是用它来发起网络请求,AFN 只是基于它的二次开发, 所以它又提供了一个AFURLSessionManager类来专门管理 URLSession,这里面完成对 NSURLSession的配置,以及代理回调
@interface AFURLSessionManager : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NSSecureCoding, NSCopying>
@property (readonly, nonatomic, strong) NSURLSession *session;
@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue;
至此,AFN 大致的东西都出来.基于 URLSession, 通过传参的形式, 封装好各种请求方法利用 URLSession进行网络请求 , 通过AFURLRequestSerialization以及AFURLResponseSerialization来管理传参的格式 以及 数据响应的格式. 利用AFSecurityPolicy(网络安全工具类)来实现证书,以及对 HTTPS 相关的配置. 还有一个附加的类就是AFNetworkReachabilityManager 用于网络监听. 这就是 AFN 的核心东西. 它实现了发起各种网络请求. 配置传参和响应数据的格式, 解决了安全问题, 监听了网络状态. 也就完成了它的使命!
我认为上面就是 AFN 的底层原理. 如果说要去解析代码. 我认为那只是代码层面的一个封装.没有撒子原理可言. 更多的是了解 AFN 的一个架构配置, 如何协调这些类来进行一个工作. 这才是我们需要掌握的东西!