1

我开始使用 Bond 在应用程序中实现基本的 MVVM 模式,并且有一个场景,我想暂时暂停对事件的观察Observable(通过标志)。

然后,我想恢复对事件的观察,但也想将在暂停期间可能错过的事件“重播/重新发送”给我的观察者。

我发现该pausable(by:)功能Observable适用​​于临时暂停事件的观察,但不确定在重新启用观察后如何“重播/重新发送”任何事件。

我正在尝试做的一个简化示例是这样的:-

  • 最初将值设置viewModel.message为“原始值”
  • viewDidLoad绑定到viewModel.message的文本label,但允许它暂停。
  • 在 UI 上有一些按钮可以
    • 更改消息 ( changeMessageButton)的值
    • 停止更新标签文本 ( stopChangingLabelTextButton)
    • 再次开始更新标签文本 ( startChangingLabelTextButton)

代码 :-

class MyViewController: UIViewController {
    let viewModel = MyViewModel()
    let shouldUpdate = Observable(true)

    @IBOutlet weak var label: UILabel!

    @IBOutlet weak var changeMessageButton: UIButton!
    @IBOutlet weak var stopChangingLabelTextButton: UIButton!
    @IBOutlet weak var startChangingLabelTextButton: UIButton!

    override func viewDidLoad() {
       viewModel.message.pausable(by: shouldUpdate).bind(to: label.bnd_text)

       changeMessageButton.bnd_tap.observe { _ in
           viewModel.message.value = "Changing Message"
       }

       stopChangingLabelTextButton.bnd_tap.observe { _ in
           shouldUpdate.value = false
       }

       startChangingLabelTextButton.bnd_tap.observe { _ in
           shouldUpdate.value = true
           // DO SOMETHING TO BE ABLE TO "REPLAY/RESEND" ANY EVENTS TO viewmodel.message 
       }
    }
}

class MyViewModel {
   let message = Observable<String>("Original Value")
}

解决这个问题的最佳方法是什么?

4

1 回答 1

3

是的,pausable将在暂停状态期间忽略和忽略事件。如果您可以仅重放最新值,则可以shouldUpdate像这样进行平面映射:

shouldUpdate.flatMapLatest { shouldUpdate -> SafeSignal<String> in 
    if shouldUpdate {
      return viewModel.message.toSignal()
    } else {
      return .never()
    }
}.bind(to: label.bnd_text)

每当shouldUpdate发出一个事件时,它要么开始传播,viewModel.message要么什么都不做。每当它开始传播viewModel.message时,它也会收到最新的值,因为 Observable 总是将最新消息重播给新的观察者。

请确保你这样做import ReactiveKit

于 2017-01-17T07:45:13.740 回答