首页 > 解决方案 > 为什么委托对象为零?

问题描述

我在委托模式方面遇到了一些奇怪的问题,我无法让它像我期望的那样工作。我想我在这里遗漏了一些东西,但我自己无法弄清楚。

这是我的类的定义方式,

class NetworkManager {

    weak var delegate: DownloaderProtocol?

    func downloadFile(downloadUrl: URL ) {
        downloadTask(with: downloadUrl).resume()
    }

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


class DownloadManager: DownloaderProtocol {

    var networkManager: NetworkManager

    init(networkManager: NetworkManager) {
        self.networkManager = networkManager
    }

    func downloadMatches(urls: [String]) {
        self.networkManager.delegate = self

        for(....) {
            self.networkManager.downloadFile(url: url)
        }
    }

    func downloadCompleted(task: URLSessionTask, error: Error) {
        // Implementation
    }
}



class Matches {

    var networkManager: NetworkManager
    init() {
        self.networkManager = NetworkManager()
    }

    func getMatchSchedules(urls: [String] , completionHandler: @escaping (Result<Data, Error>) -> Void) {
        return DownloadManager.downloadMatches(urls: [String])
    }
}

问题是什么?

当调用 urlSession - didCompleteWithError 方法时,我可以看到委托对象是nil

我试过什么?

  1. 如果我删除了委托的弱引用,即weak var delegate: DownloaderProtocol?to var delegate: DownloaderProtocol?,那么委托对象不是零。它工作正常。
  2. 我什至尝试在 Matches 类中设置代表,但代表仍显示为 nil

欢迎任何帮助或指出。

标签: iosswiftswift3delegates

解决方案


您可以使用回调代替委托。这比委托容易得多。

typealias APIServiceSuccessCallback = ((Any?) -> ())

视图控制器 A:

//call from A -> B result fire if completionHandler fire in VC B
    addCompanyTargetsController.responseCreateBookingObj = { [unowned self] (returnObject) in
                    if let object = returnObject as? [String:Any] {
                        if object["success"] as? Bool == true {
                            self.loadTargetList()//success block
                        }
                    }
                }

视图控制器 B:

var responseCreateBookingObj : APIServiceSuccessCallback? //declaration

func completionHandler() { //from where you fire call this method
        guard let callBack = self.responseCreateBookingObj else{
            return
        }
        callBack( true as AnyObject)
    }

推荐阅读