AFNetworking 源码解析之“AFURLSessionManager”

[objc] view plain copy

  1. #import <Foundation/Foundation.h>
  2. #import "AFURLResponseSerialization.h"
  3. #import "AFURLRequestSerialization.h"
  4. #import "AFSecurityPolicy.h"
  5. #import "AFNetworkReachabilityManager.h"
  6. #ifndef NS_DESIGNATED_INITIALIZER
  7. #if __has_attribute(objc_designated_initializer)
  8. #define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
  9. #else
  10. #define NS_DESIGNATED_INITIALIZER
  11. #endif
  12. #endif
  13. /**
  14. “AFURLSessionManager”类基于一个指定的“NSURLSessionConfiguration”对象,创建并管理一个“NSURLSession”对象。
  15. 并且,“AFURLSessionManager”类符合“<NSURLSessionTaskDelegate>”、 “<NSURLSessionDataDelegate>”、 “<NSURLSessionDownloadDelegate>”和“<NSURLSessionDelegate>”委托。
  16. ## 子类说明
  17. “AFHTTPSessionManager”类,增加指定HTTP请求功能。
  18. 如果你想为“AFURLSessionManager”类指定额外的HTTP请求,可以用“AFHTTPSessionManager”类来代替。
  19. ## “NSURLSession”和“NSURLSessionTask”的委托方法
  20. “AFURLSessionManager”支持以下委托方法:
  21. ### “NSURLSessionDelegate”
  22. - “URLSession:didBecomeInvalidWithError:”
  23. - “URLSession:didReceiveChallenge:completionHandler:”
  24. - “URLSessionDidFinishEventsForBackgroundURLSession:”
  25. ### “NSURLSessionTaskDelegate”
  26. - “URLSession:willPerformHTTPRedirection:newRequest:completionHandler:”
  27. - “URLSession:task:didReceiveChallenge:completionHandler:”
  28. - “URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:”
  29. - “URLSession:task:didCompleteWithError:”
  30. ### “NSURLSessionDataDelegate”
  31. - “URLSession:dataTask:didReceiveResponse:completionHandler:”
  32. - “URLSession:dataTask:didBecomeDownloadTask:”
  33. - “URLSession:dataTask:didReceiveData:”
  34. - “URLSession:dataTask:willCacheResponse:completionHandler:”
  35. ### “NSURLSessionDownloadDelegate”
  36. - “URLSession:downloadTask:didFinishDownloadingToURL:”
  37. - “URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:”
  38. - “URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:”
  39. 上面这些方法中的任何一个方法被重写,那么必须先用“super”关键字调用父类的方法。
  40. ## 网络连接状况监控
  41. 通过“reachabilityManager”属性,监视网络连接的状态和变化。
  42. 应用程序可以选择监视网络连接状态,以防止或暂停任何外传请求。
  43. 详细内容,请参考“AFNetworkReachabilityManager”类
  44. ## NSCoding说明
  45. - 编译管理器不包括Block属性。当使用“-initWithCoder:”方法或者“NSKeyedUnarchiver”类时,确定已经设置了委托回调的Block。
  46. ## NSCopying说明
  47. - “-copy”和“-copyWithZone:”方法返回一个新的管理器类,其中包含一个根据原来“NSURLSession”对象的配置所创建的、新的“NSURLSession”对象。
  48. - 操作拷贝对象时,不能包括任何只有强引用时才包含的委托回调的Block。不然当拷贝时,会存在一个指向原来会话管理器的隐性指针。
  49. @warning 后台会话管理器在使用期间,必须被拥有。这可以通过创建一个应用类或单例实现。
  50. */
  51. #if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090)
  52. @interface AFURLSessionManager : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NSSecureCoding, NSCopying>
  53. /**
  54. 会话管理器
  55. */
  56. @property (readonly, nonatomic, strong) NSURLSession *session;
  57. /**
  58. 当委托回调时,可能调用的操作队列
  59. */
  60. @property (readonly, nonatomic, strong) NSOperationQueue *operationQueue;
  61. /**
  62. 当数据传输任务用“GET”、“POST”等方式时,在“dataTaskWithRequest:success:failure:”方法里创建的一个从服务器发回的响应。
  63. 默认情况下,此属性设置为“AFJSONResponseSerializer”的一个实例。
  64. @warning “responseSerializer”必须不为空.
  65. */
  66. @property (nonatomic, strong) id <AFURLResponseSerialization> responseSerializer;
  67. ///-------------------------------
  68. /// @name 管理器的安全策略
  69. ///-------------------------------
  70. /**
  71. 安全策略,用于在请求操作中,对服务器连接是否安全的信任值评估。
  72. 在没有指定的情况下,“AFURLSessionManager”默认使用“defaultPolicy”。
  73. */
  74. @property (nonatomic, strong) AFSecurityPolicy *securityPolicy;
  75. ///--------------------------------------
  76. /// @name 监视网络连接状况
  77. ///--------------------------------------
  78. /**
  79. 网络连接状况管理器,“AFURLSessionManager”默认使用“sharedManager”。
  80. */
  81. @property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager;
  82. ///----------------------------
  83. /// @name 获取网络会话的任务
  84. ///----------------------------
  85. /**
  86. 在当前会话中,运行的数据、上传和下载的会话任务。
  87. */
  88. @property (readonly, nonatomic, strong) NSArray *tasks;
  89. /**
  90. 在当前会话中,运行的所有数据(Data)会话任务
  91. */
  92. @property (readonly, nonatomic, strong) NSArray *dataTasks;
  93. /**
  94. 在当前会话中,运行的所有上传(Upload)会话任务
  95. */
  96. @property (readonly, nonatomic, strong) NSArray *uploadTasks;
  97. /**
  98. 在当前会话中,运行的所有下载(Download)会话任务
  99. */
  100. @property (readonly, nonatomic, strong) NSArray *downloadTasks;
  101. ///-------------------------------
  102. /// @name 管理回调的队列
  103. ///-------------------------------
  104. /**
  105. “completionBlock”的线程队列。
  106. 如果为空,则在主线程中执行。
  107. */
  108. #if OS_OBJECT_HAVE_OBJC_SUPPORT
  109. @property (nonatomic, strong) dispatch_queue_t completionQueue;
  110. #else
  111. @property (nonatomic, assign) dispatch_queue_t completionQueue;
  112. #endif
  113. /**
  114. “completionBlock”的线程群。
  115. 如果为空,则在一个私有线程群中执行。
  116. */
  117. #if OS_OBJECT_HAVE_OBJC_SUPPORT
  118. @property (nonatomic, strong) dispatch_group_t completionGroup;
  119. #else
  120. @property (nonatomic, assign) dispatch_group_t completionGroup;
  121. #endif
  122. ///---------------------------------
  123. /// @name 工作系统错误
  124. ///---------------------------------
  125. /**
  126. 当首次调用返回nil时,是否重新在后台会话中创建上传任务。默认为“NO”。
  127. @bug 在iOS 7.0版本存在一个Bug:后台会话中的上传会话任务有时为“nil”。作为一个解决方法,如果这个属性是“YES”,AFNetworking将遵循苹果的建议再次尝试创建任务。
  128. @see https://github.com/AFNetworking/AFNetworking/issues/1675
  129. */
  130. @property (nonatomic, assign) BOOL attemptsToRecreateUploadTasksForBackgroundSessions;
  131. ///---------------------
  132. /// @name 初始化
  133. ///---------------------
  134. /**
  135. 根据指定的configuration,创建并返回一个会话管理器。这是指定初始化方法。
  136. @param configuration 用于创建会话管理器的配置信息.
  137. @return 一个新建的会话管理器.
  138. */
  139. - (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
  140. /**
  141. 当会话管理器无效时,可选的取消等待执行的会话任务。
  142. @param cancelPendingTasks 是否取消等待执行的会话任务.
  143. */
  144. - (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks;
  145. ///-------------------------
  146. /// @name 运行数据的会话任务
  147. ///-------------------------
  148. /**
  149. 根据指定的request,创建一个“NSURLSessionDataTask”。
  150. @param request HTTP请求的request。
  151. @param completionHandler 当会话任务结束时,执行该Block对象。该Block没有返回值,但有三个参数:服务器响应对象;解析器生成的响应对象;执行错误对象(如果不存在错误,则为nil)。
  152. */
  153. - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
  154. completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler;
  155. ///---------------------------
  156. /// @name 运行上传的会话任务
  157. ///---------------------------
  158. /**
  159. 根据一个本地文件创建request对象,再用该request对象创建的一个“NSURLSessionUploadTask”对象
  160. @param request HTTP请求的request。
  161. @param fileURL 将要被上传的本地文件的URL。
  162. @param progress 一个监视当前上传进度的进度对象。
  163. @param completionHandler 当会话任务结束时,执行该Block对象。该Block没有返回值,但有三个参数:服务器响应对象;解析器生成的响应对象;执行错误对象(如果不存在错误,则为nil)。
  164. @see “attemptsToRecreateUploadTasksForBackgroundSessions”
  165. */
  166. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
  167. fromFile:(NSURL *)fileURL
  168. progress:(NSProgress * __autoreleasing *)progress
  169. completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler;
  170. /**
  171. 根据一个HTTP体创建request对象,再用该request对象创建的一个“NSURLSessionUploadTask”对象
  172. @param request HTTP请求的request。
  173. @param bodyData 一个数据对象,包含将要被上传的HTTP体。
  174. @param progress 一个监视当前上传进度的进度对象。
  175. @param completionHandler 当会话任务结束时,执行该Block对象。该Block没有返回值,但有三个参数:服务器响应对象;解析器生成的响应对象;执行错误对象(如果不存在错误,则为nil)。
  176. */
  177. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
  178. fromData:(NSData *)bodyData
  179. progress:(NSProgress * __autoreleasing *)progress
  180. completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler;
  181. /**
  182. 根据指定的流媒体request对象,创建的一个“NSURLSessionUploadTask”对象
  183. @param request HTTP请求的request。
  184. @param progress 一个监视当前上传进度的进度对象。
  185. @param completionHandler 当会话任务结束时,执行该Block对象。该Block没有返回值,但有三个参数:服务器响应对象;解析器生成的响应对象;执行错误对象(如果不存在错误,则为nil)。
  186. */
  187. - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request
  188. progress:(NSProgress * __autoreleasing *)progress
  189. completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler;
  190. ///-----------------------------
  191. /// @name 运行下载的会话任务
  192. ///-----------------------------
  193. /**
  194. 根据指定的reques对象,创建的一个“NSURLSessionDownloadTask”对象
  195. @param request HTTP请求的request。
  196. @param progress 一个监视当前下载进度的进度对象。
  197. @param destination 一个确定下载文件的存储路径的Block对象。有两个参数:目标路径和服务器响应对象,并且返回下载文件将要存放的URL。当下载的文件移动到指定目录后,临时文件将会自动删除。
  198. @param completionHandler 当会话任务结束时,执行该Block对象。该Block没有返回值,但有三个参数:服务器响应对象;下载文件的路径;网络或者解析错误对象(如果不存在错误,则为nil)。
  199. @warning 如果用background类型的“NSURLSessionConfiguration”,当应用程序终止时,这些Block对象将被清除。后台会话更适合用“-setDownloadTaskDidFinishDownloadingBlock:”方法去指定保存下载文件的URL,而不是本方法。
  200. */
  201. - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
  202. progress:(NSProgress * __autoreleasing *)progress
  203. destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
  204. completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler;
  205. /**
  206. 根据指定的、需要恢复的数据,创建的一个“NSURLSessionDownloadTask”对象
  207. @param resumeData 需要恢复的数据对象。
  208. @param progress 一个监视当前下载进度的进度对象。
  209. @param destination 一个确定下载文件的存储路径的Block对象。有两个参数:目标路径和服务器响应对象,并且返回下载文件将要存放的URL。当下载的文件移动到指定目录后,临时文件将会自动删除。
  210. @param completionHandler 当会话任务结束时,执行该Block对象。该Block没有返回值,但有三个参数:服务器响应对象;下载文件的路径;网络或者解析错误对象(如果不存在错误,则为nil)。
  211. */
  212. - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
  213. progress:(NSProgress * __autoreleasing *)progress
  214. destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
  215. completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler;
  216. ///---------------------------------
  217. /// @name 从会话任务中获取进度
  218. ///---------------------------------
  219. /**
  220. 根据指定的会话任务,返回一个上传进度。
  221. @param uploadTask 上传会话任务。必须不为空。
  222. @return “NSProgress”对象,封装了指定上传会话任务的进度。如果为nil,则进度对象不可用。
  223. */
  224. - (NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask;
  225. /**
  226. 根据指定的会话任务,返回一个下载进度。
  227. @param downloadTask 下载会话任务。必须不为空。
  228. @return “NSProgress”对象,封装了指定下载会话任务的进度。如果为nil,则进度对象不可用。
  229. */
  230. - (NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask;
  231. ///-----------------------------------------
  232. /// @name 设置会话的委托回调
  233. ///-----------------------------------------
  234. /**
  235. 设置一个Block,当会话管理器变成无效时执行。用“NSURLSessionDelegate”的“URLSession:didBecomeInvalidWithError:”方法处理。
  236. @param block 一个Block对象,当会话管理器变成无效时执行。该Block没有返回值,但有两个参数:会话对象;与无效原因相关的错误对象。
  237. */
  238. - (void)setSessionDidBecomeInvalidBlock:(void (^)(NSURLSession *session, NSError *error))block;
  239. /**
  240. 设置一个Block,当访问服务器资源需要授权时执行。用“NSURLSessionDelegate”的“URLSession:didReceiveChallenge:completionHandler:”方法处理。
  241. @param block 一个Block对象,当访问服务器资源需要授权时执行。该Block返回身份验证的相关处理,并且有三个参数:会话对象;身份验证对象;一个指针(指向应该被解决的质询)。
  242. */
  243. - (void)setSessionDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block;
  244. ///--------------------------------------
  245. /// @name 设置会话任务的委托回调
  246. ///--------------------------------------
  247. /**
  248. 设置一个Block,当一个会话任务需要重新设置“请求体类型的流文件”发送到远程服务器时,执行。用“NSURLSessionTaskDelegate”的“URLSession:task:needNewBodyStream:”方法处理。
  249. @param block 一个Block对象,当一个会话任务需要重新设置“请求体类型的流文件”时,执行。
  250. */
  251. - (void)setTaskNeedNewBodyStreamBlock:(NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block;
  252. /**
  253. 设置一个Blcok,当一个HTTP请求试图重定向到另外一个URL时,执行。用“NSURLSessionTaskDelegate”的“URLSession:willPerformHTTPRedirection:newRequest:completionHandler:”方法处理。
  254. @param block 一个Block对象,当HTTP请求尝试重定向一个新的URL时,执行。该Block返回将要重定向的请求对象,并且有三个参数:会话对象;重定向请求对象;该请求对象返回的响应对象。
  255. */
  256. - (void)setTaskWillPerformHTTPRedirectionBlock:(NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block;
  257. /**
  258. 设置一个Block,当会话任务已经发送“访问服务器资源所需要的授权”时,执行。用“NSURLSessionTaskDelegate”的“URLSession:task:didReceiveChallenge:completionHandler:”方法处理。
  259. @param block 一个Block对象,当会话任务已经发送“访问服务器资源所需要的授权”时,执行。该Block返回对授权的处理(NSURLSessionAuthChallengeDisposition类型),并且有四个参数:会话对象;会话任务对象;授权对象;一个指针(指向用于解决授权的凭证)。
  260. */
  261. - (void)setTaskDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block;
  262. /**
  263. 设置一个Block,当定期追踪上传进度时,执行。用“NSURLSessionTaskDelegate”的“URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:”方法处理。
  264. @param block 一个Block对象,当一定数量的字节数据已经被上传到服务器时,执行。该Block没有返回值,但存在五个参数:会话对象;会话任务对象;上一次上传的字节数;已经上传的字节总数;根据最初HTTP体所确定的字节数,得出的剩余未上传字节数。该Block在主线程执行,并且可能会多次执行。
  265. */
  266. - (void)setTaskDidSendBodyDataBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block;
  267. /**
  268. 设置一个Block,当会话任务发出已执行到末尾的信息时,执行。用“NSURLSessionTaskDelegate”的“URLSession:task:didCompleteWithError:”方法处理。
  269. @param block 一个Block对象,当会话任务已经完成时,执行。该Block没有返回值,但有三个参数:会话对象;会话任务对象;在执行会话任务时;产生的错误对象。
  270. */
  271. - (void)setTaskDidCompleteBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, NSError *error))block;
  272. ///-------------------------------------------
  273. /// @name 设置数据传输会话任务的委托回调
  274. ///-------------------------------------------
  275. /**
  276. 设置一个Block对象,当data会话任务接收到一个响应对象时,执行。用“NSURLSessionDataDelegate”的“URLSession:dataTask:didReceiveResponse:completionHandler:”方法处理。
  277. @param block 一个Block对象,当data会话任务接收到一个响应对象时,执行。该Block返回响应对象的处理,并且有三个参数:会话对象;data会话任务对象;接收到的响应对象。
  278. */
  279. - (void)setDataTaskDidReceiveResponseBlock:(NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block;
  280. /**
  281. 设置一个Block对象,当data会话任务转换成下载会话任务时,执行。用“NSURLSessionDataDelegate”的“URLSession:dataTask:didBecomeDownloadTask:”方法处理。
  282. @param block 一个Block对象,当data会话任务转换成下载会话任务时,执行。该Block没有返回值,但有三个参数:会话对象;data会话任务对象;转换后的下载会话任务对象。
  283. */
  284. - (void)setDataTaskDidBecomeDownloadTaskBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block;
  285. /**
  286. 设置一个Block对象,当data会话任务接受到数据时,执行。用“NSURLSessionDataDelegate”的“URLSession:dataTask:didReceiveData:”方法处理。
  287. @param block 一个Block对象,当已经从服务器中下载一定数量的字节数据后,执行。该Block没有返回值,但有三个参数:会话对象;data会话任务对象;已接收到得数据。该Block在会话对象的操作队列中执行,并且可能会多次执行。
  288. */
  289. - (void)setDataTaskDidReceiveDataBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block;
  290. /**
  291. 设置一个Block对象,当将要对data会话任务进行缓存操作时,执行。用“NSURLSessionDataDelegate”的“URLSession:dataTask:willCacheResponse:completionHandler:”方法处理。
  292. @param block 一个Block对象,当将要对data会话任务进行缓存操作时,执行。该Block返回缓存的响应对象(NSCachedURLResponse类型),并且存在三个参数:会话对象;data会话任务对象;已接收的响应对象。
  293. */
  294. - (void)setDataTaskWillCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block;
  295. /**
  296. 设置一个Block对象,一旦会话的所有消息队列全部被发送,则执行该Block。用“NSURLSessionDataDelegate”的“URLSessionDidFinishEventsForBackgroundURLSession:”方法处理。
  297. @param block 一个Block对象,当后台会话的全部任务都处理完毕时,执行,该Block没有返回值,但有一个参数:会话对象。
  298. */
  299. - (void)setDidFinishEventsForBackgroundURLSessionBlock:(void (^)(NSURLSession *session))block;
  300. ///-----------------------------------------------
  301. /// @name 设置下载会话任务的委托回调
  302. ///-----------------------------------------------
  303. /**
  304. 设置一个Block,当下载会话任务结束时,执行。用“NSURLSessionDownloadDelegate”的“URLSession:downloadTask:didFinishDownloadingToURL:”方法处理。
  305. @param block 一个Block对象,当下载会话任务处理完毕时,执行。该Block返回已下载的数据需要存储的路径,并且有三个参数:会话对象;下载会话任务对象;当前临时存储已下载数据的路径。还有一个“AFURLSessionDownloadTaskDidFailToMoveFileNotification”通知,其中object参数为下载会话任务,userInfo参数为错误对象。
  306. */
  307. - (void)setDownloadTaskDidFinishDownloadingBlock:(NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block;
  308. /**
  309. 设置一个Block,当定期追踪下载进度时,执行。用“NSURLSessionDownloadDelegate”的“URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:”方法处理。
  310. @param block 一个Block对象,当一定数量的字节数据已经被下载时,执行。该Block没有返回值,但有五个参数:会话对象;下载会话任务对象;上一次下载的字节数;已经下载的字节总数;根据最初HTTP体所确定的字节数,得出的剩余未上传字节数。该Block在会话对象的操作队列中执行,并且可能会多次执行。
  311. */
  312. - (void)setDownloadTaskDidWriteDataBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block;
  313. /**
  314. 设置一个Block,当一个下载任务已经恢复时,执行。用“NSURLSessionDownloadDelegate”的“URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:”方法处理。
  315. @param block 一个Block对象,当下载会话任务已经恢复时,执行。该Block没有返回值,但有四个参数:会话对象;下载会话任务对象;一个锚点,描述从什么位置继续下载该文件;剩余下载量。
  316. */
  317. - (void)setDownloadTaskDidResumeBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block;
  318. @end
  319. #endif
  320. ///--------------------
  321. /// @name 通知
  322. ///--------------------
  323. /**
  324. 已弃用
  325. Posted when a task begins executing.
  326. @deprecated 用“AFNetworkingTaskDidResumeNotification”代替.
  327. */
  328. extern NSString * const AFNetworkingTaskDidStartNotification DEPRECATED_ATTRIBUTE;
  329. /**
  330. 网络任务恢复时,广播该通知
  331. */
  332. extern NSString * const AFNetworkingTaskDidResumeNotification;
  333. /**
  334. 已弃用
  335. Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task.
  336. @deprecated 用“AFNetworkingTaskDidCompleteNotification”代替.
  337. */
  338. extern NSString * const AFNetworkingTaskDidFinishNotification DEPRECATED_ATTRIBUTE;
  339. /**
  340. 网络任务结束执行时,广播该通知。
  341. 其中包括一个userInfo字典数据,userInfo字典中包含一个关于任务的额外信息。
  342. */
  343. extern NSString * const AFNetworkingTaskDidCompleteNotification;
  344. /**
  345. 网络任务挂起(暂停)时,广播该通知。
  346. */
  347. extern NSString * const AFNetworkingTaskDidSuspendNotification;
  348. /**
  349. 当一个网络会话(session)变为无效时,广播该通知。
  350. */
  351. extern NSString * const AFURLSessionDidInvalidateNotification;
  352. /**
  353. 在一个网络会话(session)的下载任务期间,当移动一个临时的下载文件到指定目录时,如果遇到错误,广播该通知。
  354. */
  355. extern NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification;
  356. /**
  357. 已弃用
  358. The raw response data of the task. Included in the userInfo dictionary of the “AFNetworkingTaskDidFinishNotification” if response data exists for the task.
  359. @deprecated 用“AFNetworkingTaskDidCompleteResponseDataKey”代替.
  360. */
  361. extern NSString * const AFNetworkingTaskDidFinishResponseDataKey DEPRECATED_ATTRIBUTE;
  362. /**
  363. 网络任务响应的原始数据数据。
  364. 如果网络任务的响应存在数据,该字符串包含在“AFNetworkingTaskDidFinishNotification”的userInfo字典中。
  365. */
  366. extern NSString * const AFNetworkingTaskDidCompleteResponseDataKey;
  367. /**
  368. 已弃用
  369. The serialized response object of the task. Included in the userInfo dictionary of the “AFNetworkingTaskDidFinishNotification” if the response was serialized.
  370. @deprecated 用“AFNetworkingTaskDidCompleteSerializedResponseKey”代替.
  371. */
  372. extern NSString * const AFNetworkingTaskDidFinishSerializedResponseKey DEPRECATED_ATTRIBUTE;
  373. /**
  374. 已经完成解析一个网络响应对象。
  375. 如果网络响应的数据已经完成解析,该字符串包含在“AFNetworkingTaskDidFinishNotification”的userInfo字典中。
  376. */
  377. extern NSString * const AFNetworkingTaskDidCompleteSerializedResponseKey;
  378. /**
  379. 已弃用
  380. The response serializer used to serialize the response. Included in the userInfo dictionary of the “AFNetworkingTaskDidFinishNotification” if the task has an associated response serializer.
  381. @deprecated 用“AFNetworkingTaskDidCompleteResponseSerializerKey”代替.
  382. */
  383. extern NSString * const AFNetworkingTaskDidFinishResponseSerializerKey DEPRECATED_ATTRIBUTE;
  384. /**
  385. 网络响应的解析器,用于解析网络响应。
  386. 如果网络任务关联了一个网络响应的解析器,该字符串包含在“AFNetworkingTaskDidFinishNotification”的userInfo字典中。
  387. */
  388. extern NSString * const AFNetworkingTaskDidCompleteResponseSerializerKey;
  389. /**
  390. 已弃用
  391. The file path associated with the download task. Included in the userInfo dictionary of the “AFNetworkingTaskDidFinishNotification” if an the response data has been stored directly to disk.
  392. @deprecated 用“AFNetworkingTaskDidCompleteAssetPathKey”代替.
  393. */
  394. extern NSString * const AFNetworkingTaskDidFinishAssetPathKey DEPRECATED_ATTRIBUTE;
  395. /**
  396. 下载任务关联的文件路径。
  397. 如果一个响应数据直接存储到磁盘,该字符串包含在“AFNetworkingTaskDidFinishNotification”的userInfo字典中。
  398. */
  399. extern NSString * const AFNetworkingTaskDidCompleteAssetPathKey;
  400. /**
  401. 已弃用
  402. Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the “AFNetworkingTaskDidFinishNotification” if an error exists.
  403. @deprecated 用“AFNetworkingTaskDidCompleteErrorKey”代替.
  404. */
  405. extern NSString * const AFNetworkingTaskDidFinishErrorKey DEPRECATED_ATTRIBUTE;
  406. /**
  407. 所有网络任务中得错误,以及解析网络任务响应数据中的错误。
  408. 如果错误存在,该字符串包含在“AFNetworkingTaskDidFinishNotification”的userInfo字典中。
  409. */
  410. extern NSString * const AFNetworkingTaskDidCompleteErrorKey;
时间: 2024-10-19 19:48:09

AFNetworking 源码解析之“AFURLSessionManager”的相关文章

【原】AFNetworking源码阅读(四)

[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDelegate类所实现的NSURLSession相关的代理方法,甚至连dataTask.uploadTask.downloadTask这几个基本概念也没说.这一篇就是为了集中消灭这些遗留问题. 2. AFURLSessionManagerTaskDelegate的代理方法 此处实现的仍然是NSURLS

【原】AFNetworking源码阅读(三)

[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data task.但是对于NSURLSession部分却没有提及.主要是精力有限,准备在这一部分把NSURLSession的知识好好梳理一遍.一切先从上一篇中的addDelegateForDataTask:函数说起,然后再介绍AFURLSessionManagerTaskDelegate,最后结合AFURLSes

【原】AFNetworking源码阅读(六)

[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AFNetworking的网络安全策略,尤其指HTTPS(大家可以先简单了解下HTTPS).再一个就是分析下AFNetworkReachabilityManager文件,看看AFNetworking如何解决网络状态的检测. 2. AFSecurityPolicy - 网络安全策略 之前我们在AFURLS

iOS开源库源码解析之Mantle

来自Leo的原创博客,转载请著名出处 我的StackOverflow 这个源码解析系列的文章 AsnycDispalyKit SDWebImage Mantle(本文) AFNetworking(3.0) MBProgressHud SwiftJSON MagicRecord Alamofire 前言 iOS开发中,不管是哪种设计模式,Model层都是不可或缺的.而Model层的第三方库常用的库有以下几个 JSONModel Mantle MJExtension JSON data到对象的转换原

YTKNetwork源码解析

对于iOS开发者来说,就算是没有用过YTKNetwork框架,应该也见过,听过了.它是猿题库技术团队开源的一个网络请求框架,内部封装了AFNetworking.它把每个请求实例化,管理它的生命周期,也可以管理多个请求. 在正式讲解源码之前,我会先讲一下该框架所用的架构和设计模式.我总觉得对架构和设计有一定的了解的话,会有助于对源码的理解. 1. 架构 先上图: YTKRequest架构图 在这里简单说明一下: YTKNetwork框架将每一个请求实例化,YTKBaseRequest是所有请求类的

iOS AFNetWorking源码详解(一)

来源:Yuzeyang 链接:http://zeeyang.com/2016/02/21/AFNetWorking-one/ 首先来介绍下AFNetWorking,官方介绍如下: AFNetworking is a delightful networking library for iOS and Mac OS X. It’s built on top of theFoundation URL Loading System, extending the powerful high-level n

AFNetworking源码的学习

忽略编译警告 AFNetworking源码中常常会出现忽略警告的代码,如下: 1 2 3 4 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgnu" // code #pragma clang diagnostic pop 表示在这个区间里忽略一些特定的clang的编译警告,因为AFNetworking作为一个库被其他项目引用,所以不能全局忽略clang的一些警告,只能在有需要的时候局部这样做.更详细

ChrisRenke/DrawerArrowDrawable源码解析

转载请注明出处http://blog.csdn.net/crazy__chen/article/details/46334843 源码下载地址http://download.csdn.net/detail/kangaroo835127729/8765757 这次解析的控件DrawerArrowDrawable是一款侧拉抽屉效果的控件,在很多应用上我们都可以看到(例如知乎),控件的github地址为https://github.com/ChrisRenke/DrawerArrowDrawable

五.jQuery源码解析之jQuery.extend(),jQuery.fn.extend()

给jQuery做过扩展或者制作过jQuery插件的人这两个方法东西可能不陌生.jQuery.extend([deep],target,object1,,object2...[objectN]) jQuery.fn.extend([deep],target,object1,,object2...[objectN])这两个属性都是用于合并两个或多个对象的属性到target对象.deep是布尔值,表示是否进行深度合并,默认是false,不执行深度合并.通过这种方式可以在jQuery或jQuery.fn