AFNetwork 3.0 源码解读(六)AFURLSessionManager

对AFURLSessionManager的解释
 `AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object
AFURLSessionManager是创建和管理一个基于特定的 `NSURLSessionConfiguration ` 对象生成 `NSURLSession` 对象.

AFURLSessionManager针对的就是 NSURLSession 来进行网络请求的。同时 AFURLSessionManager依赖于下列协议中的方法来实现网络请求
NSURLSessionDelegate
  • URLSession:didBecomeInvalidWithError:
  • URLSession:didReceiveChallenge:completionHandler:
  • URLSessionDidFinishEventsForBackgroundURLSession:
NSURLSessionTaskDelegate
  • URLSession:willPerformHTTPRedirection:newRequest:completionHandler:
  • URLSession:task:didReceiveChallenge:completionHandler:
  • URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
  • URLSession:task:didCompleteWithError:
NSURLSessionDataDelegate
  • URLSession:dataTask:didReceiveResponse:completionHandler:
  • URLSession:dataTask:didBecomeDownloadTask:
  • URLSession:dataTask:didReceiveData:
  • URLSession:dataTask:willCacheResponse:completionHandler:
NSURLSessionDownloadDelegate
  • URLSession:downloadTask:didFinishDownloadingToURL:
  • URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:
  • URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:
如果要重写上述的所有方法,开发者必须先调用父类方法([suer ..])。


AFURLSessionManager 组成

其它:

@property (readonly, nonatomic, strong) NSURLSession *session
被管理的session对象

@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue
回调时代码执行在哪个队列中

@property (nonatomic, strong) id<AFURLResponseSerialization> responseSerializer
请求完成时,对请求结果的序列化。 AFURLRequestSerialization

安全策略:

@property (nonatomic, strong) AFSecurityPolicy *securityPolicy;
securityPolicy 被用于session对象进行服务器的证书验证。除非重新设置 securityPolicy 否则 AFURLSessionManager会使用默认策略( 不允许使用无效证书、验证域名CN、不验证绑定的证书和公钥 AFSecurityPolicy

系统错误兼容:

@property (nonatomic, assign) BOOL attemptsToRecreateUploadTasksForBackgroundSessions;
在iOS7.0的系统上。存在一个潜在的bug, 有时候 当你在后台的情况下创建一个上传任务,任务可能为nil。
属性表示如果在后台的情况下初始化的一个上传任务为nil时。 是否尝试再次创建,默认为NO。

初始化:
  •  – initWithSessionConfiguration:
  •  – invalidateSessionCancelingTasks:

- (instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *) configuration;
根据一个 c onfiguration 生成session对象, 

- (void)invalidateSessionCancelingTasks:(BOOL) cancelPendingTasks;
废弃session对象。根据 cancelPendingTasks 决定是否取消在此session对象中的tasks

发送数据请求:

  •  – dataTaskWithRequest:completionHandler: 
  •  – dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *) request  completionHandler:(nullable void ( ^ ) ( NSURLResponse *response , id _Nullable responseObject , NSError *_Nullable error )) completionHandler
同下面的方法

- (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
根据传递的request对象创建一个 NSURLSessionDataTask 对象,
三个参数:     
上传进度的block,当上传进度更新时就会调用此block。
下载进度的block,当下载进度更新时就会调用此block。
PS:以上两个block会在session的队列中调用而不是在main队列里。
完成block将会在请求完成后执行。block中的三个参数分别为:服务器响应、被序列化后的响应对象、发生的错误。

发送上传请求:
  • – uploadTaskWithRequest:fromFile:progress:completionHandler:
  • – uploadTaskWithRequest:fromData:progress:completionHandler:
  • – uploadTaskWithStreamedRequest:progress:completionHandler:

- (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
根据指定的本地文件请求创建一个 NSURLSessionUploadTask。
参数:
request: http请求
fileURL: 本地要上传文件的url
completionHandler: 请求完成的回调
progress: 上传进度

- (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
根据指定的bodyData请求创建一个 NSURLSessionUploadTask。
参数:
request: http请求
bodyData: 包含在HTTP请求体中的data数据
completionHandler: 请求完成的回调
progress: 上传进度

- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *) request  progress:(nullable void ( ^ ) ( NSProgress *uploadProgress )) uploadProgressBlock  completionHandler:(nullable void ( ^ ) ( NSURLResponse *response , id _Nullable responseObject , NSError *_Nullable error )) completionHandler
创建一个具有特定数据流的NSURLSessionUploadTask请求。
参数:
request: http请求
completionHandler: 请求完成的回调
progress: 上传进度

发送下载请求:
  •  – downloadTaskWithRequest:progress:destination:completionHandler:
  •  – downloadTaskWithResumeData:progress:destination:completionHandler:

- (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
根据指定的request创建一个NSURLSessionDownloadTask,

注意 当session的创建时的 NSURLSessionConfiguration选择的是后台模式( background)时,那么当app关闭时这些blocks就会被释放,所以当session是background时建议使用 setDownloadTaskDidFinishDownloadingBlock: 方法去设定下载文件的保存路径而不是本方法中的destination的Block

- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData progress:(nullable void ( ^ ) ( NSProgress *downloadProgress ))downloadProgressBlock destination:(nullable NSURL *( ^ ) ( NSURL *targetPath , NSURLResponse *response ))destinationcompletionHandler:(nullable void ( ^ ) ( NSURLResponse *response , NSURL *_Nullable filePath , NSError *_Nullable error ))completionHandler

根据未下载完成的数据,创建一个 NSURLSessionDownloadTask 对象。
resumeData未完成的下载数据
destination决定下载文件的存放路径的blockblock中有两个参数,目标路径和服务器的响应。同时返回文件下载的URL
completionHandler当任务完成后。
completionHandlerblock会被调用
progress下载进度block。每当下载进度更新时就会执行这个block




ps: 一般网络请求都是 通过获得 指定好的Task使用resume方法进行

获得当前任务的进度:
  • – uploadProgressForTask:
  • – downloadProgressForTask:

- (nullable NSProgress *)uploadProgressForTask:(NSURLSessionTask *) task;
根据任务获得上传进度

- (nullable NSProgress *)downloadProgressForTask:(NSURLSessionTask *) task
根据任务获得下载进度
 

设置session代理的回调:

  • – setSessionDidBecomeInvalidBlock:
  • – setSessionDidReceiveAuthenticationChallengeBlock:

- (void)setSessionDidBecomeInvalidBlock:(nullable void ( ^ ) ( NSURLSession *session , NSError *error )) block
设置当session无效时的操作block。

- (void)setSessionDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition ( ^ ) ( NSURLSession *session , NSURLAuthenticationChallenge *challenge , NSURLCredential *_Nullable __autoreleasing *_Nullable credential )) block
设置当session接收到验证请求时的block操作。AFNetwork会调用 NSURLSessionDelegate中的 URLSession:didReceiveChallenge:completionHandler:处理证书验证

设置Task代理的回调:

  • – setTaskNeedNewBodyStreamBlock:
  • – setTaskWillPerformHTTPRedirectionBlock:
  • – setTaskDidReceiveAuthenticationChallengeBlock:
  • – setTaskDidSendBodyDataBlock:
  • – setTaskDidCompleteBlock:

- (void)setTaskNeedNewBodyStreamBlock:(nullable NSInputStream *( ^ ) ( NSURLSession *session , NSURLSessionTask *task )) block
当一个task请求一个新的请求消息体发送到服务器时此block执行。 实际上依赖 NSURLSessionTaskDelegate URLSession:task:needNewBodyStream:. 处理 

- (void)setTaskWillPerformHTTPRedirectionBlock:(nullable NSURLRequest *( ^ ) ( NSURLSession *session , NSURLSessionTask *task , NSURLResponse *response , NSURLRequest *request )) block
设置当HTPP请求重定向时调用的block, 实际上依赖
NSURLSessionTaskDelegate URLSession: willPerformHTTPRedirection: newRequest:completionHandler :.方法 处理 

- (void)setTaskDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition ( ^ ) ( NSURLSession *session , NSURLSessionTask *task , NSURLAuthenticationChallenge *challenge , NSURLCredential *_Nullable __autoreleasing *_Nullable credential )) block
设置Block用于当一个session的task接收到证书验证时调用。 实际上依赖NSURLSessionTaskDelegate 的 URLSession:task:didReceiveChallenge:completionHandler: .方法处理

- (void)setTaskDidSendBodyDataBlock:(nullable void ( ^ ) ( NSURLSession *session , NSURLSessionTask *task , int64_t bytesSent , int64_t totalBytesSent , int64_t totalBytesExpectedToSend )) block
设置Block每隔一段时间调用用来跟踪上传进度,实际上依赖由NSURLSessionTaskDelegate的URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:方法实现

- (void)setTaskDidCompleteBlock:(nullable void ( ^ ) ( NSURLSession *session , NSURLSessionTask *task , NSError *_Nullable error )) block
设置一个当task完成时调用的 Block

设置Data Task代理的回调:

  • – setDataTaskDidReceiveResponseBlock:
  • – setDataTaskDidBecomeDownloadTaskBlock:
  • – setDataTaskDidReceiveDataBlock:
  • – setDataTaskWillCacheResponseBlock: 
  • – setDidFinishEventsForBackgroundURLSessionBlock:

- (void)setDataTaskDidReceiveResponseBlock:(nullable NSURLSessionResponseDisposition ( ^ ) ( NSURLSession *session , NSURLSessionDataTask *dataTask , NSURLResponse *response )) block
  设置一个当DataTask请求接收到响应时调用的block 。交由 NSURLSessionDataDelegate URLSession:dataTask:didReceiveResponse:completionHandler: .方法处理


- (void)setDataTaskDidBecomeDownloadTaskBlock:(nullable void ( ^ ) ( NSURLSession *session , NSURLSessionDataTask *dataTask , NSURLSessionDownloadTask *downloadTask )) block
  设置当一个dataTask转变成downloadTak时调用的block,交由
NSURLSessionDataDelegate 的  URLSession:dataTask:didBecomeDownloadTask:. 方法 处理

- (void)setDataTaskDidReceiveDataBlock:(nullable void ( ^ ) ( NSURLSession *session , NSURLSessionDataTask *dataTask , NSData *data )) block
  设置当一个dataTask接受到数据时就调用的block,交由
NSURLSessionDataDelegate 的 URLSession:dataTask:didReceiveResponse:completionHandler :. 方法 处理

- (void)setDataTaskWillCacheResponseBlock:(nullable NSCachedURLResponse *( ^ ) ( NSURLSession *session , NSURLSessionDataTask *dataTask , NSCachedURLResponse *proposedResponse )) block
  设置当一个dataTask对请求结果的缓冲时的block。交由 NSURLSessionDataDelegate  的  URLSession:dataTask:willCacheResponse:completionHandler: .方法处理

- (void)setDidFinishEventsForBackgroundURLSessionBlock:(nullable void ( ^ ) ( NSURLSession *session )) block
  设置当session中所有消息都被发送时,调用的block。交由 NSURLSessionDataDelegate的 URLSessionDidFinishEventsForBackgroundURLSession:方法实现。


设置下载请求的代理回调: 
  • – setDownloadTaskDidFinishDownloadingBlock:
  • – setDownloadTaskDidWriteDataBlock:
  • – setDownloadTaskDidResumeBlock:


- (void)setDownloadTaskDidFinishDownloadingBlock:(nullable NSURL *_Nullable ( ^ ) ( NSURLSession *session , NSURLSessionDownloadTask *downloadTask , NSURL *location )) block

  设置一个当下载任务完成一个下载时调用的block。最终交由 NSURLSessionDownloadDelegate  的  URLSession:downloadTask:didFinishDownloadingToURL: .方法处理

- (void)setDownloadTaskDidWriteDataBlock:(nullable void ( ^ ) ( NSURLSession *session , NSURLSessionDownloadTask *downloadTask , int64_t bytesWritten , int64_t totalBytesWritten , int64_t totalBytesExpectedToWrite )) block
  设置每次追踪下载进度时调用的block,最终交由 NSURLSessionDownloadDelegate的 URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:方法处理

- (void)setDownloadTaskDidResumeBlock:(nullable void ( ^ ) ( NSURLSession *session , NSURLSessionDownloadTask *downloadTask , int64_t fileOffset , int64_t expectedTotalBytes )) block
设置一个block,当任务重新下载时调用。交由 NSURLSessionDownloadDelegate  的  URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes: .方式


AFURLSessionManager的.m文件中还有一个AFURLSessionManagerTaskDelegate类。
AFURLSessionManagerTaskDelegate主要是用于 处理与之 对应的 AFURLSessionManager请求Task的上传、下载进度和完成情况.

猜你喜欢

转载自blog.csdn.net/yuwuchaio/article/details/50504761