RxSwift:CombineLatest无休止的相同值流

问题描述

我看到无数相同事件被发送到CombineLatest,即使单个可观察对象仅打印两个值:首字母和我设置的值。我需要明确执行distinctUntilChanged()才能停止循环,但是我不明白为什么。

let one = BehaviorSubject<String?>(value: nil).debug()
let two = BehaviorSubject<Int>(value: 0).debug()

// endless stream of events with identical values
Observable.combineLatest(one,two)
    .debounce(.milliseconds(10),scheduler: MainScheduler.instance)
    .subscribe(onNext: { ... })
    .disposed(by: disposeBag)

// distinctUntilChanged breaks the cycle,but why?
Observable.combineLatest(one.distinctUntilChanged(),two.distinctUntilChanged())
    .debounce(.milliseconds(10),scheduler: MainScheduler.instance)
    .subscribe(onNext: { ... })
    .disposed(by: disposeBag)

one.onNext("a")
two.onNext(1)

解决方法

在运行此代码时,这是我看到的...

两个combineLatest调用都发出相同的值序列。

subscribed
Event next((nil,0))
Event next((Optional("a"),1))

这完全有道理。 CombineLatest运算符订阅one,它发出一个.next(nil),然后订阅two,它发出一个.next(0),所以它发出一个next((nil,0)),然后调用{{ 1}}在onNext("a")上,所以CombineLatest发出一个one,最后您在next((Optional("a"),0))上调用onNext(1),combinateLatest发出一个two

您遇到的任何问题都与您发布的代码无关。