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

标签 ios objective-c swift functional-programming rx-swift

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

欢迎所有评论。

最佳答案

有两种可能的解决方案

  1. 订阅回调时防止重复

    callback.asObservable()
      .distinctUntilChanged { $0.1 == $1.1 }
      .subscribe(onNext: { _ in /* .. */ })
    

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

  2. 在设置回调的之前防止重复

    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/

相关文章:

iPhone 初始化方法问题

objective-c - NSGraphicsContext 透视图

iphone - 深入了解崩溃

ios - Clean Swift/VIPER 协议(protocol)一致性

ios - 移动父 SKNode 后,Sprite 套件找不到 nodeAtPoint

ios - 尝试将数据传递到容器 View ,而 segue 不起作用

ios - 我可以做一个iOS一体化框架吗?或者将私有(private)静态库包含到我的框架中?

iOS 10 不调用通知服务扩展

ios - 弹出 View 关闭按钮无法正常工作

ios - Swift 中的 LaunchOptionsKey.location 是否启动整个应用程序?