Swift-URLSessionDownloadTask断点下载

2018-09-25  本文已影响0人  SK丿希望
image.png
import UIKit

/// 遵守协议
class ViewController: UIViewController,URLSessionDownloadDelegate {

    @IBOutlet weak var progressView: UIProgressView! // 进度条
    
    var downloading = false // 记录是否在下载
    var downloadData: Data? // 记录已下载的数据

    lazy var session: URLSession = {
        let configuration = URLSessionConfiguration.default
        configuration.isDiscretionary = true //自由决定选择哪种网络状态进行下载数据
        let session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
        return session
    }()
    
    // MARK: - 下载任务
    lazy var downloadTask : URLSessionDownloadTask = {
        let request = URLRequest.init(url: URL(string: "https://hjmys.oss-cn-shenzhen.aliyuncs.com/911f7716b1b4a4edd583dd604db47ae468cf4b65.mp4")!)
        let downloadTask = session.downloadTask(with: request)
        return downloadTask
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

    }
    ///按钮点击事件
    @IBAction func buttonClick(_ btn: UIButton) {
        switch  btn.tag {
        case  100:
            print("开始")
            startDownload()
        case  101:
            print("暂停")
            pauseDownload()
        case  102:
            print("恢复")
            resumeDownload()
        default:
            break
        }
        
    }
    // MARK: - 开始下载
    func startDownload() {
        downloading = true
        self.downloadTask.resume()
    }
    // MARK: - 暂停下载
    func pauseDownload() {
        self.downloadTask.cancel { [weak self] (resumeData) in
            self?.downloadData = resumeData
        }
        downloading = false
    }
    // MARK: - 恢复下载
    func resumeDownload(){
        if (downloadData != nil) {
            self.downloadTask = self.session.downloadTask(withResumeData: self.downloadData!)
            self.downloadTask.resume()
            self.downloading = true
        }
    }
    
    // 下载代理方法,下载结束
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
        print("下载结束")
    }
    // 下载代理方法,监听下载进度
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
        let request = URLRequest.init(url: URL(string: "https://hjmys.oss-cn-shenzhen.aliyuncs.com/911f7716b1b4a4edd583dd604db47ae468cf4b65.mp4")!)
        if downloadTask.currentRequest?.url == request.url {
            print("是当前任务")
        } else {
            print("不是当前任务")
        }
        if downloading == true {
            DispatchQueue.main.async {
                print(Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))
                self.progressView.setProgress(Float(totalBytesWritten) / Float(totalBytesExpectedToWrite), animated: true)
            }
        }
    }
    // 下载代理方法,下载偏移
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) {
        print("下载偏移")
        // 下载偏移,主要用于暂停续传
    }
    /*
     * 该方法下载成功和失败都会回调,只是失败的是error是有值的,
     * 在下载失败时,error的userinfo属性可以通过NSURLSessionDownloadTaskResumeData
     * 这个key来取到resumeData(和上面的resumeData是一样的),再通过resumeData恢复下载
     */
    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
        
    }
}

Dome

上一篇下一篇

猜你喜欢

热点阅读