Ios 我们如何通过distinctuntilChange只允许两个不同的项来过滤一个可观察项

Ios 我们如何通过distinctuntilChange只允许两个不同的项来过滤一个可观察项,ios,objective-c,swift,functional-programming,rx-swift,Ios,Objective C,Swift,Functional Programming,Rx Swift,目前,我正在观察滑块的类型和值(intint而不是Float),并将它们放入元组中 durationSlider.rx_controlEvent(UIControlEvents.ValueChanged) .subscribeNext { in viewModel.callback.value = (type:SliderType.Duration, value:Int((self?.dur

目前,我正在观察滑块的
类型
值(intint而不是Float)
,并将它们放入元组中

durationSlider.rx_controlEvent(UIControlEvents.ValueChanged)
              .subscribeNext { in                   
                    viewModel.callback.value = (type:SliderType.Duration, value:Int((self?.durationSlider.value)!))
               }
               .addDisposableTo(disposeBag)
回调
是视图模型中的
变量
类型。为了得到改变,我正在做

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


欢迎所有评论。

有两种可能的解决方案

  • 订阅回调时防止重复

    callback.asObservable()
      .distinctUntilChanged { $0.1 == $1.1 }
      .subscribe(onNext: { _ in /* .. */ })
    
    如果您需要在需要对
    执行操作的代码的其他部分中有订阅服务器,那么这很好。下一个
    事件不一定是不同的

  • 在设置回调的
    值之前防止重复

    durationSlider.rx_controlEvent(UIControlEvents.ValueChanged)
      .map { _ in Int(self!.durationSlider.value) }
      .distinctUntilChanged()
      .subscribeNext { value in
        viewModel.callback.value = (type:SliderType.Duration, value: value)
      }
    
    这可能就是您正在寻找的解决方案。在这里,我们首先
    将每个值更改事件映射到实际值,然后再过滤重复项。这将确保我们不会在回调中的一行中两次设置相同的值。但这不会阻止代码的另一部分将回调的值设置为完全相同的值,在这种情况下,对回调的订阅可能会收到重复的值


  • 嘿@tomah你知道有没有一种方法可以在distintichanged调用中命名元组的参数,就像这一行一样
    .distinctUntilChanged{$0.1==1.1}