我开始使用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")
}
解决这个问题的最佳方法是什么?
答案 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
。