NSURLSession 源码剖析
前沿
国内文章少看,多看官方文档阅读源码才是王道,本文只作为笔记,方便日后查阅。
NSURLSessionConfiguration
定义了NSURLSession中网络请求的行为和策略。
defaultSessionConfiguration
默认会话配置,这个配置会使用全局的缓存,cookie等信息。
ephemeralSessionConfiguration
这个配置不会对缓存或cookie以及认证信息进行存储,相当于一个私有的Session,如果你开发一个浏览器产品,这个配置相当于浏览器隐私模式。
backgroundSessionConfigurationWithIdentifier
配置的会话,在单独的进程中,控制数据传输。在iOS中,配置的会话可以使应用程序刮起挂起或终止后依然进行传输数据。如果app是由系统终止并重新启动。app可以使用相同的标志符创建新配置的对象和会话,并恢复到终止时的传输状态。
identifier
配置对象的后台会话标识符。
设置此属性的价值只有当你使用backgroundSessionConfigurationWithIdentifier:方法创建配置对象。该字符串唯一地标识一个后台会话对象。在iOS中,当应用程序在后台运行时,应用程序被终止,你就可以使用这个字符串。当应用程序重新启动时,它使用字符串来重新创建与传输相关的配置和会话对象。
requestCachePolicy
NSURLRequestUseProtocolCachePolicy
URL加载的默认请求策略
NSURLRequestReloadIgnoringLocalCacheData
请求不使用任何缓存
NSURLRequestReloadIgnoringLocalCacheData
使用的数据应该从原始源加载,不应该使用本地缓存数据。
NSURLRequestReturnCacheDataElseLoad
只有在cache中不存在data时才从原始地址下载。
NSURLRequestReturnCacheDataDontLoad
只是用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式。
NSURLRequestReloadRevalidatingCacheData
验证本地数据与远程数据是否相同,如不相同则下载远程数据否则使用本地数据。
timeoutIntervalForRequest
该属性根据此配置确定会话内所有任务的请求超时间间隔。如果原始请求由于超时而失败则会自动重试由后台会话创建的任何上传和下载的任务。要配置允许用户重试,上传或者下载任务的时间,请使用timeoutIntervalForResource属性。
networkServiceType
指定用于请求的网络服务类型
NSURLNetworkServiceTypeDefault
标准的网络流量,大多数连接应该使用这种服务类型。
NSURLNetworkServiceTypeVoIP
指定该请求用于VoIP服务,内核在你的应用程序处于后台时继续监听传入流量。
NSURLNetworkServiceTypeBackground
指定请求用于后台通信。
如果,你的应用程序正在执行未被用户请求的下载,则应指定此类型,例如,预取内容以便在用户选择查看内容时可用。
NSURLNetworkServiceTypeVoice
指定请求用于语音通信
NSURLNetworkServiceTypeCallSignaling
电话信号
allowsCellularAccess
此属性控制基于此属性控制的会话中的任务,是否允许通过蜂窝网络数据连接,默认是YES。
finishTasksAndInvalidate
立即返回,现有的任务将被允许运行完成。新任务可能无法创建。
invalidateAndCancel
针对此会话所有未完成的任务取消
resetWithCompletionHandler
重置清空所有的cookie,缓存,证书,磁盘文件
flushWithCompletionHandler
刷新token和凭据到磁盘,清除临时缓存,并确保将来的请求发生在新的TCP连接上。
getTasksWithCompletionHandler
- (void)getTasksWithCompletionHandler:(void (^)(NSArray<NSURLSessionDataTask *> *dataTasks, NSArray<NSURLSessionUploadTask *> *uploadTasks, NSArray<NSURLSessionDownloadTask *> *downloadTasks))completionHandler;
异步调用所有数据,上传和下载任务完成的回调,返回的数据包含你会话创建的任何任务,不包括在完成,失败或取消后失效的任何任务。
getAllTasksWithCompletionHandler
- (void)getAllTasksWithCompletionHandler:(void (^)(NSArray<__kindof NSURLSessionTask *> *tasks))completionHandler API_AVAILABLE(macos(10.11), ios(9.0), watchos(2.0), tvos(9.0));
所有下载任务完成之后的回调
NSURLSessionTask
属性:
// 任务标识,唯一确定一个任务
@property (readonly)NSUInteger taskIdentifier; /* an identifier for this task, assigned by and unique to the owning session */
// 创建 task时的请求对象
@property (nullable, readonly, copy) NSURLRequest *originalRequest; /* may be nil if this is a stream task */
// 当前请求对象
@property (nullable, readonly, copy) NSURLRequest *currentRequest; /* may differ from originalRequest due to http server redirection */
// 服务器的响应数据
@property (nullable, readonly, copy) NSURLResponse *response; /* may be nil if no response has been received */