美文网首页
NSURLSession(二)DataTask

NSURLSession(二)DataTask

作者: 令狐冲_ | 来源:发表于2018-03-06 17:58 被阅读0次

一 NSURLSessionTask

Task是由Session创建的,Session会保持对Task的一个强引用,直到Task完成或者出错才会释放。通过NSURLSessionTask可以获得Task的各种状态,以及对Task进行取消,挂起,继续等操作。一共包括三种Task,三种Task的结构如图。本文主要讲解的是DataTask。

NSURLSessionTask

管理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)

三 Demo

DataTaskDemo

相关文章

网友评论

      本文标题:NSURLSession(二)DataTask

      本文链接:https://www.haomeiwen.com/subject/nvglfftx.html