get progress from dataTaskWithURL in swift

后端 未结 6 1138
庸人自扰
庸人自扰 2020-11-30 03:49

Is there any way to get progress from dataTaskWithURL in swift while the data is downloading?

NSURLSession.sharedSession().dataTaskWithURL(...)         


        
6条回答
  •  一向
    一向 (楼主)
    2020-11-30 04:31

    In reference to Dharmesh's work, there have been quite a number of minor changes with URLSessionDelegate and URLSessionDataDelegate delegate methods. Here come the code for Swift 4.2 compatibility.

    import UIKit
    
    class ViewController: UIViewController, URLSessionDelegate, URLSessionDataDelegate {
        // MARK: - Variables
    
        // MARK: - IBOutlet
        @IBOutlet weak var progress: UIProgressView!
    
        // MARK: - IBAction
        @IBAction func goTapped(_ sender: UIButton) {
            let url = URL(string: "http://www.example.com/file.zip")!
            fetchFile(url: url)
        }
    
        // MARK: - Life cycle
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        func fetchFile(url: URL) {
            progress.progress = 0.0
            let configuration = URLSessionConfiguration.default
            let mainQueue = OperationQueue.main
            session = URLSession(configuration: configuration, delegate: self, delegateQueue: mainQueue)
            dataTask = session?.dataTask(with: URLRequest(url: url))
            dataTask?.resume()
        }
    
        var buffer: NSMutableData = NSMutableData()
        var session: URLSession?
        var dataTask: URLSessionDataTask?
        var expectedContentLength = 0
    
        func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
            buffer.append(data)
            let percentageDownloaded = Float(buffer.length) / Float(expectedContentLength)
            progress.progress =  percentageDownloaded
        }
    
        func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: (URLSession.ResponseDisposition) -> Void) {
            expectedContentLength = Int(response.expectedContentLength)
            completionHandler(URLSession.ResponseDisposition.allow)
        }
    
        func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
            progress.progress = 1.0
        }
    }
    

提交回复
热议问题