簡體   English   中英

帶有RxSwift的MVVM-C:關閉時的“弱自我”

[英]MVVM-C with RxSwift: '[weak self]' in closure

我正在使用RxSwift開發一個iOS項目,我使用帶有協調器模式的MVVM。

在這里我的實施:

視圖模型:

// MARK: - Private

private let showNextViewSubject = PublishSubject<Void>()

// MARK: - Inputs

var showNextView: AnyObserver<Void> {
    return showNextViewSubject.asObserver()
}

// MARK: - Outputs

var didShowNextView: Observable<Void> {
    return showNextViewSubject.asObservable()
}

視圖控制器:

private func bindButton() {
    _ = button.rx.tap
        .bind(to: viewModel.showNextView)
        .disposed(by: disposeBag)
}

統籌:

self.viewModel.didShowNextView
        .subscribe(onNext: { [weak self] _ in
            self?.showNextView()
        })
        .disposed(by: disposeBag)

我的問題在於協調器中的[weak self] _ :當我添加它時, self?.showNextView()從不被調用,但是當我刪除它時這很有效。

你知道為什么嗎?

謝謝,羅曼

當你擺脫[weak self]該塊會創建一個強大的self引用,以便在使用它完成任何其他代碼時不會釋放它。 通過使參考弱self可以自由地解除分配,這可能正在發生。 這意味着沒有其他對象具有對self的強引用,因此它是nil並且不會進行調用。 擺脫它可能會創建一個保留周期,所以你要小心這一點。

使用Swift 4.2,您可以安全地將代碼段重寫為:

self.viewModel.didShowNextView
    .subscribe(onNext: { [weak self] in
        guard let self = self else { return } 
        self.showNextView()
    })
    .disposed(by: disposeBag)

這種模式通常建議使用self?

如果你不添加[弱自我],完成塊將保留self,這不是使用塊的最佳方法。 您應該有一個引用(保留)給您的協調員,它應該在您完成后釋放。

RxSwift中的內存管理

就像這樣在他的父協調員中保持對這個協調員的引用

private var childCoordinators = [CoordinatorType]()

所以它不會被解除分配

暫無
暫無

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

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