gpt4 book ai didi

ios - 弱 self 在异步闭包 Alamofire 中始终为零

转载 作者:行者123 更新时间:2023-11-28 14:59:54 25 4
gpt4 key购买 nike

当我使用以下版本的代码时,我能够看到 self 对象(它不是 nill aways)并进行其他处理。

不将 self 转化为弱 self

    Alamofire.request(some url).responseJSON {  response in

self.resolvedURLString = "ff"
print("==\(self.resolvedURLString)")
}

但为了避免循环保留或出于安全考虑(始终在闭包中使用 weak self),我使用了以下版本的代码。

通过将 self 转化为弱 self

    Alamofire.request(some url).responseJSON { [weak self] response in

guard let strongSelf = self else { return }

strongSelf.resolvedURLString = "ff"
print("==\(strongSelf.resolvedURLString)")
}

但这里总是 self 变成 nil ,我永远无法打印 resolvedURLString 的值。如何使 self 成为 strong self 或如何保持 self 直到闭包执行结束?

编辑:从 AppDelegate 我启动了 NetworkManager,从这个类我调用了 NetworkDownloader,在这个类中将发生实际调用

AppDelegate.M

if let networkManager = self.networkManager {
networkManager.downloadDataToCache()
}

网络管理器

let __areaDownloader = AreaDownloader(backgroundContext: backgroundContext, withDelegate: nil)
__areaDownloader.download(withSuccess: {_ in
//Write code for core data
self.isAreaCachingIsComplete = true
self.checkNotificationsForCacheComplete()

}, failure: {})

AreaDownloader 类:NetworkDownloader

    override func download(withSuccess successBlock: SuccessWithJsonType?, failure failureBlock: FailureType?) {

Alamofire.request(some url).responseJSON { [weak self] response in

guard let strongSelf = self else { return }

strongSelf.resolvedURLString = "ff"
print("==\(strongSelf.resolvedURLString)")
}
}

最佳答案

当 Alamofire 的完成请求处理程序执行时,self 所指的任何对象都已消失。在响应处理程序运行之前,您需要在某处保持对 self 的强引用。在您使用强 self 的第一个示例中,闭包本身提供了强引用。在带有 weak self 的第二个示例中,没有任何作用。

您选择什么选项取决于具体情况。查看您的代码,例如,您不会在任何地方保留对 Alamofire 请求的引用,因此您可能会接受第一个选项 - self 引用的对象没有不直接或间接地保持对请求的强引用,因此没有所有权循环。

关于ios - 弱 self 在异步闭包 Alamofire 中始终为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49004074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com