AFNetworking - AFURLSessionManager 源码解读

AFNetworking

核心通信类 NSURLSession

AFURLSessionManager

核心方法

遵循了NSURLSession相关的各个协议 , 协议方法的触发是根据 task的类型来触发

- NSURLSessionDelegate
	- NSURLSessionTaskDelegate
	- NSURLSessionDataDelegate
	- NSURLSessionDownloadDelegate
复制代码

实例化方法initWithSessionConfiguration

经过 request 和 url来建立不一样的task的一系列方法

持有的重要实例对象

会话对象 session

NSURLSession实例变量, AFN的全部网络请求都必须经过 session建立的task实现
复制代码

回调时的控制队列 operationQueue

控制session绑定的代理方法 或者block回调的 队列, 默认最大并发为1, 串行队列
复制代码

返回数据序列化对象 responseSerializer

遵循了 AFURLResponseSerialization协议, 会自动进行验证和序列化 从服务端获得的数据
复制代码

安全信任对象 securityPolicy

AFSecurityPolicy 对象, 用来进行安全验证的类
复制代码

网络状态监听对象 reachabilityManager

网络状态监听对象, AFNetworkReachabilityManager
复制代码

task管理的数组对象 tasks, dataTasks, uploadTasks, downloadTasks

  • tasks数组 是 session中全部 currently run的 task的管理数组
    复制代码
  • dataTasks 是 currently run的全部请求数据类task的纪录管理数组
    复制代码
  • uploadTasks是currently run的全部上传文件类的task的纪录管理数组
    复制代码
  • downloadTasks 是currently run的全部下载文件类的task的纪录管理数组
    复制代码

相关联的主要类

task中相关操做的管理类 AFURLSessionManagerTaskDelgate

AFURLSessionManagerTaskDelegate 类是对每次请求中task的相关处理的封装, 每个任务(task) 都和对应的 delegate对象 绑定, 并以task.identifier为key, delegate对象为值, 经过key-value的方式被 AFURLSessionManager中的mutableTaskDelegatesKeyedByTaskIdentifier所管理设计模式

  • 对数据上传,数据下载进度的监听的实现
    复制代码
  • 也作了下载数据的存储路径的置顶
    复制代码
  • 对网络请求,下载,上传等task(任务)完成后的回调处理
    复制代码

但它不是直接被会话对象(NSURLSession)处理的, 而是在AFURLSessionManager中实现的 NSURLSession相关的各个协议被触发后,再根据当前的task 找到与之绑定的 AFURLSessionManagerTaskDelegate对象, 而后交给AFURLSessionManagerTaskDelegate对象去处理下一步的处理; 这里就彻底提现了 AFURLSessionManagerTaskDelegate类的做用; (大神的设计思路真是使人膜拜!)数组

_AFURLSessionTaskSwizzling

_AFURLSessionTaskSwizzling 存在的目的是为了解决在OS7和iOS8中NSURLSessionTask的父类不一样的问题; 经过runtime的原理,在load()方法中实现了 resume()和suspend()方法与 af_resume()和af_suspend方法的替换处理,这样就解决了在iOS7和iOS8中由于NSURLSessionTask父类不一样致使resume和suspend不统一的问题安全

AFHTTPSessionManager

继承于AFURLSessionManager, 是AFN中对HTTP相关请求的封装类, 主要提供了方便咱们进行POST, GET,HEAD, PATCH, DELETE的一些方法;bash

  • 实例化方法 manager, manager方法采用的并非单利设计模式,而是工厂设计模式
//详细代码
+ (instancetype)manager {
    return [[[self class] alloc] initWithBaseURL:nil];
}
- (instancetype)init {
    return [self initWithBaseURL:nil];
}
- (instancetype)initWithBaseURL:(NSURL *)url {
    return [self initWithBaseURL:url sessionConfiguration:nil];
}
- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
    return [self initWithBaseURL:nil sessionConfiguration:configuration];
}
复制代码

在AFURLSessionManager中注意到的知识点

weak关键字的使用, 用来防止循环引用
@interface AFURLSessionManagerTaskDelegate : NSObject <NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>
//weak的使用(manager持有task,task和delegate是绑定的,至关于manager是持有delegate的),在这种场景中采用 weak关键字来修饰
@property (nonatomic, weak) AFURLSessionManager *manager;
@end
复制代码
将回调操做的block @property 属性化到 AFURLSessionManager.h中, 并从新在AFURLSessionManager.m中set方法重写, 方便被外部调用的设计思路
代码举例:
@interface AFURLSessionManager ()
@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidReceiveResponseBlock dataTaskDidReceiveResponse;
@end

@implementation AFURLSessionManager
- (void)setDataTaskDidReceiveResponseBlock:(NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block {
    self.dataTaskDidReceiveResponse = block;
}
@end

复制代码
AFURLSessionManagerTaskDelgate类的设计, 让AFURLSessionManager管理 task和与之相对应的 AFURLSessionManagerTaskDelgate 对象, 将每一个task最后的数据处理, 进度处理转移到 AFURLSessionManagerTaskDelgate 实例化对象中, 让整个流程思路变得很是清晰明了
相关文章
相关标签/搜索