Swift 未调用UrlSessionLegate方法

Swift 未调用UrlSessionLegate方法,swift,urlsession,Swift,Urlsession,首先,我已经检查了类似的现有问题,没有一个答案适用。 我正在尝试使用URLSessionDownloadTask下载一个文件,如下所示 class MyNetworkManager : NSObject { static let instance = MyNetworkManager() var downloadSession : URLSession? init() { super.init() let download

首先,我已经检查了类似的现有问题,没有一个答案适用。

我正在尝试使用
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?)
    {
        //
    }
}
但是,没有调用
urlsessionelegate
方法

通常,如果使用完成处理程序创建任务,则不会调用委托方法-事实并非如此,我只是在创建任务时使用
URLRequest
作为参数

会话的
委托
已正确设置,调用
downloadTask?.resume()后,其
状态
属性为
正在运行

MyNetworkManager
是一个单身汉,我就是这样使用它的

MyNetworkManager.instance.download(someURL)
因此,一个实例肯定会被保留


我在这里遗漏了什么吗?

您必须遵守相关协议,例如:

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
方法。

在错误的签名委托方法之间,可能会很快发布的
MyNetworkManager
实例,缺少委托方法(假设您出错而未成功),等等。它缺少一些信息。@Larme不是这样,
MyNetworkManager
实例为retained@matt说得好。编辑了这个问题
MyNetworkManager
是一个单例,尝试使用
MyNetworkManager.instance.download(someURL)