Методы успеха делегата URLSession не вызываются, но нет ошибки

Я использую DataTask URLSession для загрузки файла с URLSessionDownloadDelegate в качестве обработчика результата. Однако urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) никогда не вызывается. Вместо этого я получаю urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) с нулевой ошибкой. При использовании вместо него метода completeHandler для выполнения задачи все работает.

Вот мой код:

import UIKit

class ViewController: UIViewController, URLSessionDownloadDelegate {

var downloadTask: URLSessionDataTask?

override func viewDidLoad() {
    super.viewDidLoad()

    let configuration = URLSessionConfiguration.default
    let session = URLSession(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)

    let url = URL(string: "https://unsplash.it/200/300/?random")!
    //downloadTask = session.dataTask(with: request)
    downloadTask = session.dataTask(with: url)
    downloadTask!.resume()
}


@IBAction func cancelButtonTapped(_ sender: Any) {
    downloadTask?.cancel()
}

func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {
    print("session: didBecomeInvalidWithError: \(error?.localizedDescription)")
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
    print("Your data is here!")
}

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

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
    print("session: task: didCompleteWithError: \(error?.localizedDescription)")
    session.finishTasksAndInvalidate()
}

}

Выход симулятора

session: task: didCompleteWithError: nil
session: didBecomeInvalidWithError: nil

Заранее спасибо.


person MasterCarl    schedule 02.01.2017    source источник


Ответы (1)


Вы должны использовать URLSessionDownloadTask вместо URLSessionDataTask и использовать фон для URLSessionConfiguration следующим образом:

var downloadTask: URLSessionDownloadTask?
var session: URLSession?

override func viewDidLoad() {
        super.viewDidLoad()


        let configuration = URLSessionConfiguration.background(withIdentifier: "backgroundSession")
        session = URLSession(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)

        let url = URL(string: "https://unsplash.it/200/300/?random")!
        downloadTask = session?.downloadTask(with: url)
        downloadTask!.resume()

}
person Sebastian    schedule 03.01.2017
comment
Либо так, либо используйте правильные методы делегирования для задачи данных и накапливайте данные самостоятельно. Так или иначе. - person dgatwood; 03.01.2017
comment
Спасибо, это сработало! Однако использовать фон для URLSessionConfiguration не было необходимости. - person MasterCarl; 04.01.2017