Почему URLSession не входит в URLSessionDownloadDelegate? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь распечатать процесс загрузки, используя URLSessionDownloadDelegate, но методы делегата не работают Хотя изображение загружается, прогресс не печатается

У меня есть кнопка

@IBAction func downloadTapped(_ sender: UIButton) {
        let image = "https://neilpatel-qvjnwj7eutn3.netdna-ssl.com/wp-content/uploads/2016/02/applelogo.jpg"
        guard let url = URL(string: image) else {return}

        let operationQueue = OperationQueue()
        let session = URLSession(configuration: .default, delegate: self, delegateQueue: operationQueue)
        session.downloadTask(with: url) { (data, response, error) in
            guard let url = data else {return}
            do {
                let data = try Data(contentsOf: url)
                OperationQueue.main.addOperation {
                    self.imageView.image = UIImage(data: data)
                }

            } catch {

            }


        }.resume()

    }

И расширение

extension DownloadingViewController: URLSessionDownloadDelegate {

    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
        print("=====FINISH=====")
    }

    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
        let progress = Float(bytesWritten) / Float(totalBytesWritten)
        print(progress)
    }

}

вообще ничего

1 Ответ

2 голосов
/ 23 апреля 2019

Вы звоните

session.downloadTask(with: url) { (data, response, error) in

Это означает, что URLSession delegate игнорируется, поскольку у задачи загрузки есть обработчик завершения, который используется вместо него. Итак, вы видите ожидаемое поведение.


Если вы хотите использовать делегата, звоните

session.downloadTask(with: url)

и выполните все в делегате, включая получение загруженного файла.


С другой стороны, если ваша цель - просто показать прогресс, делегат не нужен. С этой целью задача загрузки реализует объект progress. Пример:

    let task = session.downloadTask(with:url) { fileURL, resp, err in
        // whatever
    }
    // self.prog is a UIProgressView
    self.prog.observedProgress = task.progress
    task.resume()
...