我们如何通过 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 【问题描述】:

目前,我正在观察滑块的 typevalue ( 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)

callbackVariable 在视图模型中键入。为了得到改变,我正在做

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 的使用

订阅的角度限制发射

RxJava 方法备忘录

在 RxCocoa/RxSwift 中,如何观察 BehaviorRelay<[object]> 数组大小发生变化