如何将 URLSession 委托与自定义 class 结合使用

How to use URLSession delegate with custom class

我习惯于使用单例为 URLSession 定制 class。所以我第一次将它与 URLSession 委托一起使用,我感到很困惑。因为没有调用委托方法!

我能知道什么解决办法吗?我错过了什么吗?

我只是想检查为 URLSession 定制 class 是否是一件好事?

这是我的代码。这是我为 URLSession.

定制的 API

import UIKit

class CustomNetworkAPI {
    static let shared = CustomNetworkAPI()
    var session: URLSession?
    private var sessionDataTask: URLSessionDataTask?
    private var sessionDownloadTask: URLSessionDownloadTask?
    var cache: URLCache?
    
    private init() {}
    
    func downloadTaskForImage(_ url: URL, _ completionHandler: @escaping (Result<URL, Error>) -> ()) {
//        print(session.delegate)
        sessionDownloadTask = session?.downloadTask(with: url, completionHandler: { (url, response, error) in
            if let error = error {
                completionHandler(.failure(error))
                return
            }
            
            guard let url = url else {
                completionHandler(.failure(URLRequestError.dataError))
                return
            }
            
            completionHandler(.success(url))
        })
        
        sessionDownloadTask?.resume()
    }
}

这是 VC 使用 api 和委托的示例代码(不是全部)。

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let api = CustomNetworkAPI.shared
        let config = URLSessionConfiguration.default

        api.session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

        guard let url = URL(string: "...") else { return }
        
        api.downloadTaskForImage(url) { (result) in
            switch result {
            case .success(let url):
                print(url)
            case .failure(let error):
                print(error)
            }
        }
    }
}


extension ViewController: URLSessionDownloadDelegate {
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
        print("down load complete")
    }
    
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
        print("ing")
    }
}

我遗漏了一些东西,这是我在苹果文档中找到的下面这句话。

Your URLSession object doesn’t need to have a delegate. If no delegate is assigned, a system-provided delegate is used, and you must provide a completion callback to obtain the data.

所以我尝试删除完成处理程序块,并调用了委托方法。