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 组成

其它:
  • 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决定下载文件的存放路径的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的上传、下载进度和完成情况.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ThinkPHP是一款开源免费的PHP开发框架,而ThinkPHP 3.0是ThinkPHP框架的一个版本。ThinkPHP 3.0源码是指这个版本框架的源代码,通过阅读和理解源码,我们可以深入了解框架的设计思想、工作原理以及具体的实现方式。 ThinkPHP框架的源码以MVC(Model-View-Controller)模式组织,将应用程序分为模型、视图和控制器三个层次。其中,模型层用于处理数据、数据库操作等;视图层负责用户界面的展示;控制器层负责接受用户请求,进行逻辑处理,并将结果返回给用户。 ThinkPHP 3.0源码的核心部分包括路由解析、请求分发、调度机制、缓存管理、数据库操作等。框架通过路由解析来将用户的请求转发给对应的控制器进行处理,同时支持URL重写、多模块或子域名部署等高级路由功能。框架还提供了灵活的请求分发机制,可以对请求进行过滤、日志记录、权限控制等操作。 另外,ThinkPHP 3.0源码还提供了丰富的扩展和插件机制。开发者可以通过自定义的扩展或插件来增加框架的功能或修改特定的行为,从而更好地满足自己的需求。这种可扩展性使得ThinkPHP成为一个非常灵活的框架,适用于各种规模和类型的项目。 总之,通过深入研究ThinkPHP 3.0源码,我们可以更好地理解框架的工作原理和设计思想,从而能够更高效地使用和开发基于ThinkPHP的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FY_Chao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值