ios - 如何使用 RxSwift 让 ViewController 观察 ViewModel 变量(Variable<..>)的任何变化?

标签 ios swift observer-pattern rx-swift

我如何观察 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/

相关文章:

java - 随着模型内部状态的变化更新 java GUI

c# - 使用委托(delegate)在 C# 中实现的观察者模式?

design-patterns - 回调/命令与EventListener/观察者模式

ios - 在警报 View 之前键盘不会被关闭

ios - 委托(delegate)返回 nil 且未被调用

ios - admob 广告被关闭后执行 segue

swift - Facebook Scores API 只显示我

iOS/Objective-C 元类和类别

ios - 指向数组元素的 UnsafeMutablePointer

iOS:如何检测键盘变化事件