[英]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,這不是使用塊的最佳方法。 您應該有一個引用(保留)給您的協調員,它應該在您完成后釋放。
就像這樣在他的父協調員中保持對這個協調員的引用
private var childCoordinators = [CoordinatorType]()
所以它不會被解除分配
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.