iOS技术

AFN 底层原理剖析(二)---AFHTTPSessionMan

2021-09-01  本文已影响0人  iOS刘耀宗

上一篇文章我们主要讲解了 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 的一个架构配置, 如何协调这些类来进行一个工作. 这才是我们需要掌握的东西!

上一篇下一篇

猜你喜欢

热点阅读