我如何观察 Variable<...>
的变化? RxSwift
内的值 ( Variable
ViewModel
)来自 ViewController
的类(class)?
因此,如果我的 Variable<..>
中的任何一个值我在ViewModel
ViewModel
内部发生的事情变化然后是 ViewController
会注意到“嘿!ViewModel 中的一个或多个 Variable<..> 已更改!向 ViewModel 询问更新 UI 所需的数据并更新 UI!”
然后是 ViewController
调用方法 updateUI()
在 ViewController 内部并在其中询问 ViewModel
获取状态/状态等所有信息以更新 UI,例如:
func updateUI() {
progressBar.hide = viewModel.getProgressBarVisibility()
errorMessageLabel.hide = viewModel.getErrorMessageVisibility()
errorMessageLabel.text = viewModel.getErrorMessageText()
.....
...
}
最佳答案
如果单个 ViewModel 的属性值发生变化,为什么要更新整个 UI?
RxSwift 使您能够独立监听变化,并且您可以相应地使用react/更改 UI。
在我看来,您的 ViewModel 和 ViewController 类应该是这样的:
class ViewModel {
private var progressBarVisibiity:Variable<Double> = Variable.init(0.0)
private var errorMessageVisibiity:Variable<Double> = Variable.init(0.0)
private var errorMessageLabel:Variable<String> = Variable.init("Default text")
public func setProgressBarVisibiity(_ value:Double) {
progressBarVisibiity.value = value
}
public func setErrorMessageVisibiity(_ value:Double) {
errorMessageVisibiity.value = value
}
public func setErrorMessageLabel(_ value:String) {
errorMessageLabel.value = value
}
public func observeProgressBarVisibiity() -> Observable<Double> {
return progressBarVisibiity.asObservable().observeOn(MainScheduler())
}
public func observeErrorMessageVisibiity() -> Observable<Double> {
return errorMessageVisibiity.asObservable().observeOn(MainScheduler())
}
public func observeErrorMessageLabel() -> Observable<String> {
return errorMessageLabel.asObservable().observeOn(MainScheduler())
}
}
class ViewController {
let viewModel = ViewModel()
let disposeBag = DisposeBag()
func observeViewModelChanges() {
viewModel
.observeProgressBarVisibiity()
.subscribe(onNext: { value in
self.progressBar.hide = viewModel.getProgressBarVisibility()
})
.disposed(by: disposeBag)
viewModel
.observeErrorMessageVisibiity()
.subscribe(onNext: { value in
self.errorMessageLabel.hide = value
})
.disposed(by: disposeBag)
viewModel
.observeErrorMessageLabel()
.subscribe(onNext: { value in
self.errorMessageLabel.text = value
})
.disposed(by: disposeBag)
}
}
关于ios - 如何使用 RxSwift 让 ViewController 观察 ViewModel 变量(Variable<..>)的任何变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53479087/