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" 任何事件观察。
我正在尝试做的一个简化示例是:-
- 初始设置
viewModel.message
的值为"Original Value"
- 在
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")
}
解决这个问题的最佳方法是什么?
是的,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
。
我开始使用 Bond 在应用程序中实现基本的 MVVM 模式,并且有一个场景,我想暂时中止对 Observable
上的事件的观察(通过标志)。
然后我想恢复事件的观察,但也想"replay/resend"我的观察者在暂停期间可能错过的事件。
我在 Observable
上找到了 pausable(by:)
函数,它可以很好地临时停止观察事件,但我不确定如何在重新启用后 "replay/resend" 任何事件观察。
我正在尝试做的一个简化示例是:-
- 初始设置
viewModel.message
的值为"Original Value" - 在
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")
}
解决这个问题的最佳方法是什么?
是的,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
。