距离51小长假还有不到4个小时,干等也是等,不如湿等吧- - -过一遍URLSession的API,平日里也是习惯了使用AFNetworking、Alamofire完成数据请求,很少有需要去看这些系统的东西了。
URLSession提供了三种构造方式,分别是单利方式、携带配置信息、携带代理对象和任务队列:1
2
3open class var shared: URLSession { get }
public /*not inherited*/ init(configuration: URLSessionConfiguration)
public /*not inherited*/ init(configuration: URLSessionConfiguration, delegate: URLSessionDelegate?, delegateQueue queue: OperationQueue?)
URLSessionConfiguration用于管理session的行为和策略,比如超时时间、缓冲策略、是否允许蜂窝数据请求等等,有如下三种类型:1
2
3
4
5
6// 默认
open class var `default`: URLSessionConfiguration { get }
// 和.default类似,但是缓存、cookie、凭据无法使用了,无法存到磁盘中
open class var ephemeral: URLSessionConfiguration { get }
// 后台session, 典型的后台下载任务
open class func background(withIdentifier identifier: String) -> URLSessionConfiguration
sessionObj.configuration属性是只读的,所以设置session配置信息只能在构造session的时候,之后便不可可变这些配置信息,如果要改变,那也只能是在另外创建一个session了。通过sessionObj.share方式使session是没有配置信息的。
在构造会话的时候传入一个URLSessionDataDelegate对象,这样就可以获取会话进行的状态,同样sessionObj.delegate是只读的,只能在构造会话的时候设置。
开启会话之后,便可以绑定会话任务URLSessionTask,通过调用不同的API创建不同类型的任务,如下四种:1
2
3
4
5
6
7
8// 将请求的数据存到内存中 sessionObj.dataTask(with:)
open class URLSessionDataTask : URLSessionTask {}
// 上传任务 URLSessionDataTask的子类 sessionObj.dataTask.uploadTask(with:from:)
open class URLSessionUploadTask : URLSessionDataTask {}
// 下载任务
open class URLSessionDownloadTask : URLSessionTask {}
// 流任务,和指定主机端口或者服务器建立tcp/ip连接,streamTask(withHostName:port:) or streamTask(with:)
open class URLSessionStreamTask : URLSessionTask {}
URLSessionDataTask类型的任务会将
任务创建之后便可以通过sessionObj.resume()开启任务,任务中的所有属性都是可以通过kvo来监听状态改变的,当我们发起一个一般的请求任务或者下载任务的时候,可以监听countOfBytesReceived来获取已经请求到数据的长度1
2
3task.addObserver(self, forKeyPath: "countOfBytesReceived",
options: .new,
context: nil)
会话任务提供了两种
URLSessionDataTask
A URL session task that returns downloaded data directly to the app in memory.
会直接把下载的数据到数据存在内容中,写demo的时候下载了一个800多M的文件,直接触发了内存警告,所以慎用它访问稍大的文件