#swift #delegates #urlsession
#swift #делегаты #urlsession
Вопрос:
я пытаюсь распечатать ход загрузки с помощью 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:
Вы вызываете
session.downloadTask(with: url) { (data, response, error) in
Это означает, что delegate
URLSession игнорируется, потому что задача загрузки имеет обработчик завершения, который используется вместо этого. Итак, вы видите ожидаемое поведение.
Если вы хотите использовать делегат, вызовите
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()