带有 RxSwift 的 MVVM-C:闭包中的“[weak self]”

ver*_*otr 5 mvvm swift rx-swift

我正在使用 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()
}
Run Code Online (Sandbox Code Playgroud)

视图控制器:

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

协调员:

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

我的问题出[weak self] _在协调器中:当我添加它时,self?.showNextView()它永远不会被调用,但是当我删除它时效果很好。

你知道为什么吗?

谢谢,罗曼

ymu*_*tlu 1

如果不添加[weak self],完成块将保留self,这不是使用块的最佳方式。您应该有一个对您的协调员的引用(保留),并且在您完成后应该将其释放。

RxSwift 中的内存管理