我们如何通过 distinctuntilChange 只允许 2 个不同的项目来过滤 Observable

How we can filters an Observable by only allowing 2 distinct items through distinctuntilChange

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

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()

欢迎所有评论。

有两种可能的解决方案

  1. 订阅回调时防止重复

    callback.asObservable()
      .distinctUntilChanged { [=10=].1 == .1 }
      .subscribe(onNext: { _ in /* .. */ })
    

    如果您需要在代码的其他部分有订阅者,这些订阅者需要对不一定不同的 .next 事件采取行动,这很好。

  2. 在设置回调之前防止重复 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 每个值将事件更改为实际值,然后再过滤重复项。这将确保我们不会在回调中连续两次设置相同的值。但这不会阻止代码的另一部分将回调的值设置为完全相同,在这种情况下,对回调的订阅可能会收到重复项。