AFN - AFURLSessionManager

2017-06-28  本文已影响0人  lxl125z

非常棒的文章-AFURLSessionManager

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设置各种情况的代理回调

代理方法Block.png

这些方法是对NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, 和 NSURLSessionDelegate这几个协议的协议方法的block形式的实现。

上一篇下一篇

猜你喜欢

热点阅读