我开始使用Bond在应用程序中实现一个基本的MVVM模式,并且有一个场景,我想暂时挂起对Observable上事件的观察(通过一个标志)。
然后,我想恢复对事件的观察,但也想“重播/重放”在暂停期间可能错过的事件给我的观察员。
我已经在一个pausable(by:)上找到了Observable函数,它可以很好地暂停对事件的观察,但是我不知道如何在重新启用观察之后“重放/重新发送”任何事件。
我试图做的一个简单的例子是:-
viewModel.message的值设置为“原始值”viewDidLoad上,将viewModel.message绑定到label文本,但允许将其暂停。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")
}解决这个问题的最好方法是什么?
发布于 2017-01-17 07:45:13
是的,在暂停状态期间,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时,它也会收到最新的值,因为可观察的总是向新的观察者重放最近的值。
请确保你做了import ReactiveKit。
https://stackoverflow.com/questions/41667586
复制相似问题