- NSURLSessionDelegate
- NSURLSessionTaskDelegate
- NSURLSessionDataDelegate
- NSURLSessionDownloadDelegate
复制代码
NSURLSession实例变量, AFN的全部网络请求都必须经过 session建立的task实现
复制代码
控制session绑定的代理方法 或者block回调的 队列, 默认最大并发为1, 串行队列
复制代码
遵循了 AFURLResponseSerialization协议, 会自动进行验证和序列化 从服务端获得的数据
复制代码
AFSecurityPolicy 对象, 用来进行安全验证的类
复制代码
网络状态监听对象, AFNetworkReachabilityManager
复制代码
tasks数组 是 session中全部 currently run的 task的管理数组
复制代码
dataTasks 是 currently run的全部请求数据类task的纪录管理数组
复制代码
uploadTasks是currently run的全部上传文件类的task的纪录管理数组
复制代码
downloadTasks 是currently run的全部下载文件类的task的纪录管理数组
复制代码
AFURLSessionManagerTaskDelegate 类是对每次请求中task的相关处理的封装, 每个任务(task) 都和对应的 delegate对象 绑定, 并以task.identifier为key, delegate对象为值, 经过key-value的方式被 AFURLSessionManager中的mutableTaskDelegatesKeyedByTaskIdentifier所管理设计模式
对数据上传,数据下载进度的监听的实现
复制代码
也作了下载数据的存储路径的置顶
复制代码
对网络请求,下载,上传等task(任务)完成后的回调处理
复制代码
但它不是直接被会话对象(NSURLSession)处理的, 而是在AFURLSessionManager中实现的 NSURLSession相关的各个协议被触发后,再根据当前的task 找到与之绑定的 AFURLSessionManagerTaskDelegate对象, 而后交给AFURLSessionManagerTaskDelegate对象去处理下一步的处理; 这里就彻底提现了 AFURLSessionManagerTaskDelegate类的做用; (大神的设计思路真是使人膜拜!)数组
_AFURLSessionTaskSwizzling 存在的目的是为了解决在OS7和iOS8中NSURLSessionTask的父类不一样的问题; 经过runtime的原理,在load()方法中实现了 resume()和suspend()方法与 af_resume()和af_suspend方法的替换处理,这样就解决了在iOS7和iOS8中由于NSURLSessionTask父类不一样致使resume和suspend不统一的问题安全
继承于AFURLSessionManager, 是AFN中对HTTP相关请求的封装类, 主要提供了方便咱们进行POST, GET,HEAD, PATCH, DELETE的一些方法;bash
//详细代码
+ (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];
}
复制代码
@interface AFURLSessionManagerTaskDelegate : NSObject <NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>
//weak的使用(manager持有task,task和delegate是绑定的,至关于manager是持有delegate的),在这种场景中采用 weak关键字来修饰
@property (nonatomic, weak) AFURLSessionManager *manager;
@end
复制代码
代码举例:
@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
复制代码