我们如何通过 distinctuntilChange 只允许 2 个不同的项目来过滤 Observable
Posted
技术标签:
【中文标题】我们如何通过 distinctuntilChange 只允许 2 个不同的项目来过滤 Observable【英文标题】:How we can filters an Observable by only allowing 2 distinct items through distinctuntilChange 【发布时间】:2017-01-15 05:06:50 【问题描述】:目前,我正在观察滑块的 type
和 value ( int Int instead of Float )
并将它们放入元组中
durationSlider.rx_controlEvent(UIControlEvents.ValueChanged)
.subscribeNext in
viewModel.callback.value = (type:SliderType.Duration, value:Int((self?.durationSlider.value)!))
.addDisposableTo(disposeBag)
callback
是 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
...........
有什么方法可以避免获得相同的值,这样我就只能在 Int 中为滑块更改不同的值。我不完全确定在这种情况下是否可以使用distinctUntilChange()
。
欢迎所有 cmets。
【问题讨论】:
【参考方案1】:有两种可能的解决方案
订阅回调时防止重复
callback.asObservable()
.distinctUntilChanged $0.1 == $1.1
.subscribe(onNext: _ in /* .. */ )
如果您需要在代码的其他部分有订阅者,这些订阅者需要对不一定不同的 .next
事件采取行动,这很好。
在设置回调的value
之前防止重复
durationSlider.rx_controlEvent(UIControlEvents.ValueChanged)
.map _ in Int(self!.durationSlider.value)
.distinctUntilChanged()
.subscribeNext value in
viewModel.callback.value = (type:SliderType.Duration, value: value)
这可能是您正在寻找的解决方案。在这里,我们首先将map
每个值更改事件更改为实际值,然后过滤重复项。这将确保我们不会在回调中连续两次设置相同的值。但这不会阻止另一部分代码将回调的值设置为完全相同,在这种情况下,回调的订阅可能会收到重复。
【讨论】:
嘿@tomahh 你知道是否有办法在 distintUntilChanged 调用中命名元组的参数,就像这一行一样?.distinctUntilChanged $0.1 == $1.1
以上是关于我们如何通过 distinctuntilChange 只允许 2 个不同的项目来过滤 Observable的主要内容,如果未能解决你的问题,请参考以下文章
react-autosuggest 与 debounce 和 distinctUntilChanged
[RxJS] Filtering operators: distinct and distinctUntilChanged
Rxjava2的操作符FilterDebounce DistinctUntilChanged SwitchMap 的使用