【问题标题】:Bond/ReactiveKit - Temporarily suspend observing events and start observing again (but see events that were missed)Bond/ReactiveKit - 暂时暂停观察事件并重新开始观察(但查看错过的事件)
【发布时间】:2017-01-15 23:39:26
【问题描述】:

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

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

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

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

  • 最初将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")
}

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

【问题讨论】:

    标签: swift mvvm reactivekit


    【解决方案1】:

    是的,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-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2017-09-09
    相关资源
    最近更新 更多