美文网首页iOS技术
AFN 底层原理剖析(二)---AFHTTPSessionMan

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

作者: iOS刘耀宗 | 来源:发表于2021-09-01 17:37 被阅读0次

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

    相关文章

      网友评论

        本文标题:AFN 底层原理剖析(二)---AFHTTPSessionMan

        本文链接:https://www.haomeiwen.com/subject/tcoxwltx.html