![](/img/trans.png)
[英]Do I need to use [weak self] if I'm making a network request using a singleton networking service?
[英]Should I use `weak self` when making asynchronous network request?
这是我从网络中获取一些数据的方法:
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
对success
闭包有很强的引用,而success
闭包对self
(也就是 ViewModel)有很强的引用。 它创建了保留循环。 但是,在deinit
拥有 ViewModel 的ViewController
之后,无论如何都会调用 ViewModel 的 deinit。 这意味着没有保留周期。 为什么?
只要你的viewmodel是一个类,你就必须弱捕获self,否则你会有一个强引用循环。 由于fetchProducts
是异步的,它的成功闭包可能会在您的 viewmodel 已经被释放后执行 - 或者如果闭包没有对它的强引用就会被释放。 异步闭包中的强引用将阻止视图模型被释放。
如果您在类中调用service.fetchProducts
并在异步闭包中访问self
,则确实需要[weak self]
。 如果您要在值类型( struct
或enum
)中执行此操作,或者如果您没有在闭包内访问self
,则不需要[weak self]
- 在值类型中,您甚至不能执行[weak self]
.
service.fetchProducts(parameters: params, success: { [weak self] response in
self?.isLoading?(false)
/// doing something with response
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.