繁体   English   中英

进行异步网络请求时是否应该使用“弱自我”?

[英]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有很强的引用, servicesuccess闭包有很强的引用,而success闭包对self (也就是 ViewModel)有很强的引用。 它创建了保留循环。 但是,在deinit拥有 ViewModel 的ViewController之后,无论如何都会调用 ViewModel 的 deinit。 这意味着没有保留周期。 为什么?

只要你的viewmodel是一个类,你就必须弱捕获self,否则你会有一个强引用循环。 由于fetchProducts是异步的,它的成功闭包可能会您的 viewmodel 已经被释放执行 - 或者如果闭包没有对它的强引用就会被释放。 异步闭包中的强引用将阻止视图模型被释放。

如果您在类中调用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
}) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM