URLSessionDelegate методы не вызваны - PullRequest
1 голос
/ 16 октября 2019

Во-первых, я уже проверил подобные существующие вопросы, и ни один из ответов не применяется.
Делегаты NSURLSession не вызваны
Функция URLSessionDelegate не вызывается

Я пытаюсь загрузить файл, используя URLSessionDownloadTask, например

class MyNetworkManager : NSObject
{
    static let instance = MyNetworkManager()

    var downloadSession : URLSession?

    init()
    {
        super.init()

        let downloadConfiguration = URLSessionConfiguration.default
        downloadSession = URLSession(configuration: downloadConfiguration, delegate: self, delegateQueue: nil)
    }

    func download(_ url : URL)
    {
        var urlRequest = URLRequest(url: url)
        urlRequest.httpMethod = "GET"
        let downloadTask = downloadSession?.downloadTask(with: urlRequest)

        downloadTask?.resume()
    }
}

extension MyNetworkManager : URLSessionDelegate
{
    func urlSession(_ session: URLSession,
                    downloadTask: URLSessionDownloadTask,
                    didWriteData bytesWritten: Int64,
                    totalBytesWritten: Int64,
                    totalBytesExpectedToWrite: Int64)
    {
        // 
    }

    func urlSession(_ session: URLSession,
                    downloadTask: URLSessionDownloadTask,
                    didFinishDownloadingTo location: URL)
    {
        //
    }

    func urlSession(_ session: URLSession,
                    task: URLSessionTask,
                    didCompleteWithError error: Error?)
    {
        //
    }
}

Однако методы URLSessionDelegate не вызываются.

Обычно методы делегата не вызываются, если вы создаете задачу с обработчиком завершения - это не так, я использую только URLRequest в качестве параметра при создании задачи.

Session'sdelegate установлен правильно, и после вызова downloadTask?.resume() его свойство state равно running

MyNetworkManager - это одиночный код, я использую его так:

MyNetworkManager.instance.download(someURL)

так что экземпляр определенно сохраняется.

Я что-то здесь упускаю?

1 Ответ

1 голос
/ 16 октября 2019

Вы должны соответствовать соответствующим протоколам, например:

extension MyNetworkManager: URLSessionDelegate {
    // this is intentionally blank

    // obviously, if you implement any delegate methods for this protocol, put them here
}

extension MyNetworkManager: URLSessionDownloadDelegate {
    func urlSession(_ session: URLSession,
                    downloadTask: URLSessionDownloadTask,
                    didWriteData bytesWritten: Int64,
                    totalBytesWritten: Int64,
                    totalBytesExpectedToWrite: Int64) {
        print(#function)
    }

    func urlSession(_ session: URLSession,
                    downloadTask: URLSessionDownloadTask,
                    didFinishDownloadingTo location: URL) {
        print(#function)
    }
}

extension MyNetworkManager: URLSessionTaskDelegate {
    func urlSession(_ session: URLSession,
                    task: URLSessionTask,
                    didCompleteWithError error: Error?) {
        print(#function, error ?? "No error")
    }
}

Если вы не соответствуете URLSessionDownloadDelegate, он не будет вызывать URLSessionDownloadDelegate методы.

...