ReactiveSwift:如何重新绑定(删除旧绑定,添加新绑定)?
我有一个视图必须能够定期重新绑定到一个新的视图模型:这意味着删除旧的绑定以及连接新的绑定。我有一个可行的解决方案,但它不是线程安全的,我想知道是否有更惯用的方法来实现这一点:ReactiveSwift:如何重新绑定(删除旧绑定,添加新绑定)?,swift,reactive-swift,Swift,Reactive Swift,我有一个视图必须能够定期重新绑定到一个新的视图模型:这意味着删除旧的绑定以及连接新的绑定。我有一个可行的解决方案,但它不是线程安全的,我想知道是否有更惯用的方法来实现这一点: var disposeBag = CompositeDisposable() func bind(viewModel: TopicProgressViewModel) { disposeBag.dispose() disposeBag = CompositeDisposable() dispos
var disposeBag = CompositeDisposable()
func bind(viewModel: TopicProgressViewModel) {
disposeBag.dispose()
disposeBag = CompositeDisposable()
disposeBag += self.reactive.isHidden <~ viewModel.isHidden
disposeBag += height <~ viewModel.height
disposeBag += label.reactive.text <~ viewModel.label
disposeBag += progress.reactive.progress <~ viewModel.progressFraction
}
var disposeBag=CompositeDisposable()
func绑定(视图模型:TopicProgressViewModel){
disposeBag.dispose()
disposeBag=CompositeDisposable()
disposeBag+=self.reactive.ishiden您可以尝试使用信号序列化绑定,使用scan
来保持当前绑定状态。可能类似于:
class TopicProgressView {
private let bindInput: Observer<TopicProgressViewModel, NoError>
private let bindSignal: Signal<CompositeDisposable, NoError>
init() {
private let (signal, observer) = Signal<TopicProgressViewModel, NoError>.pipe()
bindInput = observer
bindSignal = signal
.scan(CompositeDisposable()) { [unowned self] disposeBag, newViewModel in
disposeBag.dispose()
let newDisposeBag = CompositeDisposable()
newDisposeBag += self.reactive.isHidden <~ newViewModel.isHidden
newDisposeBag += self.height <~ newViewModel.height
newDisposeBag += self.label.reactive.text <~ newViewModel.label
newDisposeBag += self.progress.reactive.progress <~ newViewModel.progressFraction
return newDisposeBag
}
}
func bind(viewModel: TopicProgressViewModel) {
bindInput.send(value: viewModel)
}
}
类主题进度视图{
私有输入:观察者
专用信号机:信号机
init(){
私有let(信号,观察者)=signal.pipe()
bindInput=观察者
信号
.scan(CompositeDisposable()){[unowned self]disposeBag,中的newViewModel
disposeBag.dispose()
设newDisposeBag=CompositeDisposable()
newDisposeBag+=self.reactive.isHidden您可以尝试使用信号序列化绑定,使用scan
来保持当前绑定状态。可能是这样的:
class TopicProgressView {
private let bindInput: Observer<TopicProgressViewModel, NoError>
private let bindSignal: Signal<CompositeDisposable, NoError>
init() {
private let (signal, observer) = Signal<TopicProgressViewModel, NoError>.pipe()
bindInput = observer
bindSignal = signal
.scan(CompositeDisposable()) { [unowned self] disposeBag, newViewModel in
disposeBag.dispose()
let newDisposeBag = CompositeDisposable()
newDisposeBag += self.reactive.isHidden <~ newViewModel.isHidden
newDisposeBag += self.height <~ newViewModel.height
newDisposeBag += self.label.reactive.text <~ newViewModel.label
newDisposeBag += self.progress.reactive.progress <~ newViewModel.progressFraction
return newDisposeBag
}
}
func bind(viewModel: TopicProgressViewModel) {
bindInput.send(value: viewModel)
}
}
类主题进度视图{
私有输入:观察者
专用信号机:信号机
init(){
私有let(信号,观察者)=signal.pipe()
bindInput=观察者
信号
.scan(CompositeDisposable()){[unowned self]disposeBag,中的newViewModel
disposeBag.dispose()
设newDisposeBag=CompositeDisposable()
newDisposeBag+=self.reactive.ishiden您应该使用SerialDisposable
var dispose = SerialDisposable()
func bind(viewModel: TopicProgressViewModel) {
var disposeBag = CompositeDisposable()
// serialDisposable will automatic dispose previous inner disposable
dispose.inner = disposeBag
disposeBag += self.reactive.isHidden <~ viewModel.isHidden
disposeBag += height <~ viewModel.height
disposeBag += label.reactive.text <~ viewModel.label
disposeBag += progress.reactive.progress <~ viewModel.progressFraction
}
var dispose=SerialDisposable()
func绑定(视图模型:TopicProgressViewModel){
var disposeBag=CompositeDisposable()
//serialDisposable将自动处理以前的内部一次性文件
dispose.inner=disposeBag
disposeBag+=self.reactive.ishiden您应该使用SerialDisposable
var dispose = SerialDisposable()
func bind(viewModel: TopicProgressViewModel) {
var disposeBag = CompositeDisposable()
// serialDisposable will automatic dispose previous inner disposable
dispose.inner = disposeBag
disposeBag += self.reactive.isHidden <~ viewModel.isHidden
disposeBag += height <~ viewModel.height
disposeBag += label.reactive.text <~ viewModel.label
disposeBag += progress.reactive.progress <~ viewModel.progressFraction
}
var dispose=SerialDisposable()
func绑定(视图模型:TopicProgressViewModel){
var disposeBag=CompositeDisposable()
//serialDisposable将自动处理以前的内部一次性文件
dispose.inner=disposeBag
disposeBag+=self.reactive.ishiden我必须编辑一点(当前在队列中)以避免[unowned self]在init()中太早,但除此之外,它工作得很好:谢谢!很有意义。在我看来,scan
是一个被低估的反应运算符。这是一种管理状态的非常好的方法。我必须编辑一点(当前在队列中)在init()中过早地避免[unowned self],但除此之外,它工作得很好:谢谢!很有意义。在我看来,scan
是一种被低估的反应式操作符。这是一种很好的状态管理方法。我不知道SerialDisposable
,它看起来像是一个有用的类。我唯一关心的是,似乎新旧绑定将在一段很短的时间内出现gs同时存在。也许将dispose.inner=disposeBag
移动到var disposeBag=CompositeDisposable()
的正下方会解决这个问题?我同意我们应该在绑定之前进行处理,很遗憾,现在不让我编辑(队列已满?或者这只是出于礼貌,我没有代表)。但我仍然认为这是一个简单的首选答案。我不知道SerialDisposable
,它看起来像是一个有用的类。我唯一关心的是,似乎会有一个短暂的时期,新旧绑定同时存在。可能会将dispose.inner=disposeBag
移动到var disp>的正下方osebag=CompositeDisposable()
会解决这个问题吗?我同意我们应该在绑定之前处理,遗憾的是,现在不允许我编辑(队列已满?或者可能只是出于礼貌,我没有代表)。不过,由于它的简单性,我还是将此作为首选答案。