Bond/ReactiveKit - 暂时停止观察事件并重新开始观察(但看到错过的事件)

Bond/ReactiveKit - Temporarily suspend observing events and start observing again (but see events that were missed)

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

然后我想恢复事件的观察,但也想"replay/resend"我的观察者在暂停期间可能错过的事件。

我在 Observable 上找到了 pausable(by:) 函数,它可以很好地临时停止观察事件,但我不确定如何在重新启用后 "replay/resend" 任何事件观察。

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

代码:-

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")
}

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

是的,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