问题描述
我看到无数相同事件被发送到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
。
您遇到的任何问题都与您发布的代码无关。