AFURLSessionManager根据一个指定的NSURLSessionConfiguration创建和管理一个NSURLSession对象。并且这个对象实现了NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, 和 NSURLSessionDelegate这几个协议的协议方法。同时实现NSSecureCoding和NSCopying来实现归档解档和copy功能。
AFURLSessionManager通过对task设置一个AFURLSessionManagerTaskDelegate代理来处理请求进度管理,在iOS7和iOS8及以上的系统,NSRULSessionTask的具体实现是不同的,所以用了runtime动态添加了af_resume和af_suspend并且替换了系统的方法
1、初始化API和属性
指定的初始化方法、通过他来初始化一个Manager对象。传nil默认是defaultSessionConfiguration,数据处理会在内部创建OperationQueue
- (instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)configuration
AFURLSessionManager通过session来管理和创建网络请求。一个manager就实现了对这个session的管理,他们是一一对应的关系。
@property (readonly, nonatomic, strong) NSURLSession *session;
处理网络请求回调的操作队列,就是我们初始化session的时候传入的那个OperationQueue参数。如果不传入,默认是MainOperationQueue。
@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue;
对返回数据的处理都通过这个属性来处理,比如数据的提取、转换等。默认是一个AFJSONResponseSerializer
对象用JSON的方式解析。
@property (nonatomic, strong) id <AFURLResponseSerialization> responseSerializer;
用于指定session的安全策略。用于处理信任主机和证书认证等。默认是defaultPolicy。
@property (nonatomic, strong) AFSecurityPolicy *securityPolicy;
观测网络状态的变化
@property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager;
2、获取Task
当前session创建的各种类型tasks
@property (readonly, nonatomic, strong) NSArray <NSURLSessionTask *> *tasks;
@property (readonly, nonatomic, strong) NSArray <NSURLSessionDataTask *> *dataTasks;
@property (readonly, nonatomic, strong) NSArray <NSURLSessionUploadTask *> *uploadTasks;
@property (readonly, nonatomic, strong) NSArray <NSURLSessionDownloadTask *> *downloadTasks;
用于处理任务回调的GCD的group对象,如果不初始化、则一个默认的Group被使用。
@property (nonatomic, strong, nullable) dispatch_group_t completionGroup;
用于处理任务回调的GCD对象,默认是dispatch_main_queue。
@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue;
在iOS7的环境下,我们通过background模式的session创建的uploadTask有时会是nil,如果这个属性是yes,AFN会尝试再次创建uploadTask。
@property (nonatomic, assign) BOOL attemptsToRecreateUploadTasksForBackgroundSessions;
废除manager对应的Session。通过传入的参数来决定是否立即取消已经用session发出去的任务。
- (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks;
3、管理Task创建Block
他把所有delegate方法细节都处理好。直接提供给我们一些最实用的api,我们就不用去管理session系列繁琐的delegate方法了.
创建一个NSURLSessionDataTask
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;
创建一个NSURLSessionDataTask,并且能获取上传或者下载进度
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
uploadProgress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
downloadProgress:(nullable void (^)(NSProgress *downloadProgress))downloadProgressBlock
completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;
创建一个上传Task,并且指定上传文件的路径。获取上传进度
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
fromFile:(NSURL *)fileURL
progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;
创建一个上传Task,并且指定上传的数据。获取上传进度
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
fromData:(nullable NSData *)bodyData
progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;
创建一个uploadTask,(表单形式)然后上传数据
- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request
progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock
completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler;
新建一个download任务,destination表示的下载文件的缓存路径
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgressBlock
destination:(nullable NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
completionHandler:(nullable void (^)(NSURLResponse *response, NSURL * _Nullable filePath, NSError * _Nullable error))completionHandler;
继续恢复一个download任务。resumeData参数表示的是恢复下载的时候初始化数据,比如前面已经下载好的部分数据。
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgressBlock
destination:(nullable NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
completionHandler:(nullable void (^)(NSURLResponse *response, NSURL * _Nullable filePath, NSError * _Nullable error))completionHandler;
获取指定Task的上传进度
- (nullable NSProgress *)uploadProgressForTask:(NSURLSessionTask *)task;
获取指定Task的下载进度
- (nullable NSProgress *)downloadProgressForTask:(NSURLSessionTask *)task;
AFURLSessionManager设置各种情况的代理回调
这些方法是对NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, 和 NSURLSessionDelegate这几个协议的协议方法的block形式的实现。