对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 组成
其它:
session
operationQueue
responseSerializer
@property (readonly, nonatomic, strong) NSURLSession *session
被管理的session对象
@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue
回调时代码执行在哪个队列中
@property (nonatomic, strong) id<AFURLResponseSerialization> responseSerializer
请求完成时,对请求结果的序列化。
AFURLRequestSerialization
安全策略:
securityPolicy
@property (nonatomic, strong) AFSecurityPolicy *securityPolicy;
securityPolicy
被用于session对象进行服务器的证书验证。除非重新设置
securityPolicy
否则
AFURLSessionManager会使用默认策略(
不允许使用无效证书、验证域名CN、不验证绑定的证书和公钥
)。
AFSecurityPolicy
系统错误兼容:
attemptsToRecreateUploadTasksForBackgroundSessions
@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:决定下载文件的存放路径的block。block中有两个参数,目标路径和服务器的响应。同时返回文件下载的URL。
completionHandler:当任务完成后。
completionHandler的block会被调用
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的上传、下载进度和完成情况.