目前,我正在观察 slider 的 type
和 value(int Int 而不是 Float)
并将它们放入元组中
durationSlider.rx_controlEvent(UIControlEvents.ValueChanged)
.subscribeNext { in
viewModel.callback.value = (type:SliderType.Duration, value:Int((self?.durationSlider.value)!))
}
.addDisposableTo(disposeBag)
callback
是 View 模型中的Variable
类型。为了获得改变,我正在做
callback.asObservable()
.subscribeNext {(sliderType, value) in
print("value n is \(value)")
}
.addDisposableTo(disposeBag)
因为我以 Int 类型而不是 Float 类型发出 valueChanged
,所以我得到了一些相同的值
value is 13
value is 13
value is 14
...........
有什么方法可以避免获得相同的值,以便我只获得 slider Int 中更改的不同值。我不完全确定在这种情况下是否可以使用 distinctUntilChange()
。
欢迎所有评论。
最佳答案
有两种可能的解决方案
订阅回调时防止重复
callback.asObservable() .distinctUntilChanged { $0.1 == $1.1 } .subscribe(onNext: { _ in /* .. */ })
如果您需要在代码的其他部分有订阅者,这些订阅者需要对不一定不同的
.next
事件采取行动,这很好。在设置回调的
值
之前防止重复durationSlider.rx_controlEvent(UIControlEvents.ValueChanged) .map { _ in Int(self!.durationSlider.value) } .distinctUntilChanged() .subscribeNext { value in viewModel.callback.value = (type:SliderType.Duration, value: value) }
这可能是您正在寻找的解决方案。在这里,我们首先将每个值更改事件
映射
到实际值,然后再过滤重复项。这将确保我们不会在回调中连续两次设置相同的值。但这不会阻止代码的另一部分将回调的值设置为完全相同的值,在这种情况下,对回调的订阅可能会收到重复项。
关于ios - 我们如何通过 distinctuntilChange 只允许 2 个不同的项目来过滤 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41658000/