簡體   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