簡體   English   中英

如果我使用單一網絡服務發出網絡請求,是否需要使用[弱自我]?

[英]Do I need to use [weak self] if I'm making a network request using a singleton networking service?

假設我有一個使用Alamofire的SessionManager的網絡單例,如下所示:

進口Alamofire

class Network {
    static let shared = Network()
    private init() {}

    private var sessionManager: SessionManager = {
        let configuration = URLSessionConfiguration.default
            configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders

                return SessionManager(configuration: configuration)
    }

    func postRequest(params: [String: Any]? = nil, completion: (() -> ())? = nil) {
        sessionManager.request(url, method: .post, parameters: params).validate().responseData {
            // do something with response
            completion()
        }
      }
}

然后我在服務類中使用它:

class SomeService {
    static let shared = SomeService()
    private init() {}

    func doSomePostRequest(params: [String: Any]? = nil, completion: (() -> ())? = nil) {
        Network.shared.postRequest(params: params, completion: completion)
    }
}

然后我發出請求並使用此服務類重新加載tableview:

class MyViewController: UITableViewController {
    @IBAction func fetchData(_: Any)  {
        SomeService.shared.doSomePostRequest {
            // do i need to use [weak self] here?
            self.tableView.reloadData()
        }
    }
}

我還需要使用[弱自我]來避免崩潰和強大的參考周期嗎? 在任何時候,用戶都可以通過按Back來關閉MyViewController。

假設我不需要它,我是否正確,因為服務類是單身? 如果我在MyViewController中創建一個實例,我必須使用[弱自我]?

您使用對對象的弱引用來確保它們應該被釋放。

單身人士永遠不會被解除分配。 因此,無論你有強,弱或不安全的指針都沒關系。 無需使參考弱。

我不是特別了解Alamofire的SessionManager,但總的來說,是的,你需要防止額外的保留,即使你使用的是單身人士。 事實上,你必須要防止他們, 特別是因為他們是單身人士。

看你的代碼中, self你擔心是MyViewController。 如果您在單件SomeService中創建對MyViewController的強引用,那么MyViewController將永遠不會被釋放,因為您的單例存在於應用程序的生命周期中。 它並不是每個說明的保留周期(它不是周期性的),但效果是相同的 - MyViewController及其保留的所有對象永遠不會被釋放。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM