Bond / ReactiveKit - 暂时暂停观察事件并再次开始观察(但查看遗漏的事件)

时间:2017-01-15 23:39:27

标签: swift mvvm reactivekit

我开始使用Bond在应用程序中实现基本的MVVM模式,并且我希望暂时暂停Observable上的事件观察(通过标志)。

我希望恢复对事件的观察,但也希望重播/重新发送"在暂停期间可能错过的观察员事件。

我在pausable(by:)上找到了Observable函数,该函数适用于临时暂停观察事件,但我不确定如何重播/重新发送"重新启用观察后的任何事件。

我尝试做的一个简单示例是: -

  • 最初将viewModel.message的值设置为"原始值"
  • viewDidLoad绑定viewModel.messagelabel的文字,但允许其可以使用。
  • 在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")
}

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

1 个答案:

答案 0 :(得分: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