gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:35:56 24 4
gpt4 key购买 nike

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

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

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

我正在尝试做的一个缩减示例是:-

  • 最初将 viewModel.message 的值设置为“原始值”
  • viewDidLoad 上将 viewModel.message 绑定(bind)到 label 的文本,但允许它暂停。
  • 在 UI 上有一些按钮
    • 改变消息的值(changeMes​​sageButton)
    • 停止更新标签文本(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")
}

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

最佳答案

是的,pausable 将忽略和省略暂停状态期间的事件。如果您只接受最新的值,您可以像这样平面 map 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

关于swift - Bond/ReactiveKit - 暂时停止观察事件并重新开始观察(但看到错过的事件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41667586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com