一 NSURLSessionTask
Task是由Session创建的,Session会保持对Task的一个强引用,直到Task完成或者出错才会释放。通过NSURLSessionTask可以获得Task的各种状态,以及对Task进行取消,挂起,继续等操作。一共包括三种Task,三种Task的结构如图。本文主要讲解的是DataTask。
管理task的状态的方法
// 取消一个task
open func cancel()
// 如果task在挂起状态,则继续执行task
open func suspend()
// 挂起task
open func resume()
获得task的执行情况的属性
countOfBytesExpectedToReceive
countOfBytesReceived
countOfBytesExpectedToSend
countOfBytesSent
task的综合信息
currentRequest // 当前活跃的request
originalRequest // 在task创建的时候传入的request(有可能会重定向)
response // 服务器对当前活跃请求的响应
taskDescription // 描述当前task
taskIdentifier // 用来区分Task的描述符
error //Task失败的错误信息
task状态的枚举
public enum State : Int {
case running
case suspended
case canceling
case completed
}
二 NSURLSessionDataTask代理
DataTask是用来干嘛的呢?
用来下载数据到内存里,数据的格式是NSData
dataTask使用的过程中,有两种方式来处理结果
1 通过闭包的方式(不关注过程,只关注结果,使用简单)
举个例子
下载一幅图片,完成后显示到ImageView。
let dataTask = session.dataTask(with: URL(string: imageURL)!) {[weak self] (data:Data?, response:URLResponse?, error:Error?) in
if error == nil {
let image = UIImage(data: data!)
self?.imageView.image = image
}
}
dataTask.resume()
2 通过代理方法来管理session和task( 可以获得全部过程,但是较为复杂)
- NSURLSessionDelegate用来处理Session层次的事件
Session被invalide得到的时间
optional public func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?)
Session层次收到了授权,证书等问题
optional public func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void)
- NSURLSessionTaskDelegate是使用代理的时候,任何种类task都要实现的代理
Task完成的事件
optional public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
Task层次收到了授权,证书等问题
optional public func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void)
将会进行HTTP,重定向
optional public func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Swift.Void)
- NSURLSessionDataDelegate特别用来处理dataTask的事件
收到了Response,这个Response包括了HTTP的header(数据长度,类型等信息),这里可以决定DataTask以何种方式继续(继续,取消,转变为Download)
optional public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Swift.Void)
DataTask已经转变成DownloadTask
optional public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didBecome downloadTask: URLSessionDownloadTask)
每收到一次Data时候调用
optional public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
是否把Response存储到Cache中
optional public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse, completionHandler: @escaping (CachedURLResponse?) -> Swift.Void)