ios - 为什么委托对象为零?
问题描述
我在委托模式方面遇到了一些奇怪的问题,我无法让它像我期望的那样工作。我想我在这里遗漏了一些东西,但我自己无法弄清楚。
这是我的类的定义方式,
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。
我试过什么?
- 如果我删除了委托的弱引用,即
weak var delegate: DownloaderProtocol?
tovar delegate: DownloaderProtocol?
,那么委托对象不是零。它工作正常。 - 我什至尝试在 Matches 类中设置代表,但代表仍显示为 nil
欢迎任何帮助或指出。
解决方案
您可以使用回调代替委托。这比委托容易得多。
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)
}
推荐阅读
- php - 数据表搜索返回 Sql Exceloption
- angular - 角度测试找不到打开的对话框
- rust - 不可变 Vec 的 Arc/Mutex 的可变展开
- jitsi - 如何在 JitsiMeet 中设置状态记录模式
- javascript - discord.js 无法读取未定义的属性“第一个”
- node.js - 使用 xml2js 时没有得到预期的 JSON 格式,可以修复吗?
- python - 有没有办法用不同的输入运行相同的 python 测试
- docker - 如果卷移动到 dockerfile 中,Docker-kompose 会抛出“mount destination not absolute”
- html - 如何访问 html 文本框并输入值?
- vb.net - VB.net中的转换日期与精确解析?