美文网首页
AFN - AFURLSessionManager

AFN - AFURLSessionManager

作者: lxl125z | 来源:发表于2017-06-28 11:36 被阅读0次

    非常棒的文章-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形式的实现。

    相关文章

      网友评论

          本文标题:AFN - AFURLSessionManager

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