gpt4 book ai didi

ios - 发出异步网络请求时我应该使用 `weak self` 吗?

转载 作者:行者123 更新时间:2023-12-01 19:29:30 27 4
gpt4 key购买 nike

这是我从网络中获取一些数据的方法:

func fetchProducts(parameters: [String: Any],
success: @escaping ([Product]) -> Void)
正如你所注意到的,它有逃逸的关闭。这是我在 ViewModel 中调用上述方法的方式:
service.fetchProducts(parameters: params, success: { response in
self.isLoading?(false)
/// doing something with response
})
问题是我应该捕获 self弱还是强?为什么?我想我可以强烈地捕捉到它。因为, fetchProducts是一个以闭包为参数的函数。但是,我可能错了。但是,从另一个角度来看,我认为它应该是弱的。因为,ViewModel 对 service 有很强的引用。 , service强烈引用 successself 有强烈引用的闭包(即 ViewModel)。它创建了保留周期。但是 deinit无论如何都会调用 ViewModel,在 ViewController 之后拥有 ViewModel 的被取消初始化。这意味着没有保留周期。为什么?

最佳答案

只要你的viewmodel是一个类,你就必须弱捕获self,否则你会有一个强引用循环。由于fetchProducts是异步的,它的成功闭包可能会在您的 View 模型已经被释放后执行 - 或者如果闭包没有持有对它的强引用,则可能会被释放。异步闭包中的强引用将阻止 View 模型被释放。
如果您调用service.fetchProducts在类里面并访问 self在异步闭包中,您确实需要 [weak self] .如果您要在值类型中执行此操作( structenum )或者如果您没有访问 self在闭包内,你不需要 [weak self] - 在值类型中,你甚至不能做 [weak self] .

service.fetchProducts(parameters: params, success: { [weak self] response in
self?.isLoading?(false)
/// doing something with response
})

关于ios - 发出异步网络请求时我应该使用 `weak self` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63813502/

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