为什么 RxSwift concat 与多个可观察对象似乎不起作用?
Why RxSwift concat with multiple observables does not seem to work?
我的RxSwift
代码是,
func testOperators(){
let bag = DisposeBag()
let observable1 = PublishSubject<String>()
let observable2 = PublishSubject<String>()
Observable.concat([observable1, observable2])
.subscribe(onNext: { (value) in
print(value)
}).disposed(by: bag)
observable1.on(.next("1"))
observable1.on(.next("2"))
observable2.on(.next("3"))
observable2.on(.next("4"))
observable1.on(.completed)
observable2.on(.completed)
}
当前输出是,
1
2
我的预期输出是,
1
2
3
4
我缺少什么以及我可以add/edit 获得预期的输出?
您在 concat 订阅 observable2 之前发出“3”和“4”。 concat 尚未订阅 observable2,因为它正在等待 observable1 完成。当 concat 订阅 observable2 时,“3”和“4”事件已经消失。
打个比方:假设你有两个人投球,你有一个接球手。你已经告诉接球手接住第一个投掷者的所有球,然后切换到第二个投掷者。第一个投掷者将两个球投给接球手,第二个投掷者将两个球投给任何人,因为接球者正在等着看第一个投掷者是否会再投球。然后第一个投掷者告诉接球手他已经投完球了。然后接球手开始观察第二个投掷者,后者说他也完成了。结果捕手只抓到两个球
如果您要将 observable2 转换为具有足够大缓冲区的 ReplaySubject
,那么它将重播它为每个订阅者接收到的所有事件,您将获得您想要的输出。
let bag = DisposeBag()
let observable1 = PublishSubject<String>()
let observable2 = PublishSubject<String>()
Observable.concat([observable1, observable2])
.subscribe(onNext: { (value) in
print(value)
}).disposed(by: bag)
observable1.on(.next("1"))
observable1.on(.next("2"))
observable1.on(.completed) //observable1 emission has been completed here.
//so now observable2 emission will start here
observable2.on(.next("3"))
observable2.on(.next("4"))
observable2.on(.completed) //observable2 emission has been completed here.
这将为您提供预期的输出,希望对您有所帮助:)
我的RxSwift
代码是,
func testOperators(){
let bag = DisposeBag()
let observable1 = PublishSubject<String>()
let observable2 = PublishSubject<String>()
Observable.concat([observable1, observable2])
.subscribe(onNext: { (value) in
print(value)
}).disposed(by: bag)
observable1.on(.next("1"))
observable1.on(.next("2"))
observable2.on(.next("3"))
observable2.on(.next("4"))
observable1.on(.completed)
observable2.on(.completed)
}
当前输出是,
1
2
我的预期输出是,
1
2
3
4
我缺少什么以及我可以add/edit 获得预期的输出?
您在 concat 订阅 observable2 之前发出“3”和“4”。 concat 尚未订阅 observable2,因为它正在等待 observable1 完成。当 concat 订阅 observable2 时,“3”和“4”事件已经消失。
打个比方:假设你有两个人投球,你有一个接球手。你已经告诉接球手接住第一个投掷者的所有球,然后切换到第二个投掷者。第一个投掷者将两个球投给接球手,第二个投掷者将两个球投给任何人,因为接球者正在等着看第一个投掷者是否会再投球。然后第一个投掷者告诉接球手他已经投完球了。然后接球手开始观察第二个投掷者,后者说他也完成了。结果捕手只抓到两个球
如果您要将 observable2 转换为具有足够大缓冲区的 ReplaySubject
,那么它将重播它为每个订阅者接收到的所有事件,您将获得您想要的输出。
let bag = DisposeBag()
let observable1 = PublishSubject<String>()
let observable2 = PublishSubject<String>()
Observable.concat([observable1, observable2])
.subscribe(onNext: { (value) in
print(value)
}).disposed(by: bag)
observable1.on(.next("1"))
observable1.on(.next("2"))
observable1.on(.completed) //observable1 emission has been completed here.
//so now observable2 emission will start here
observable2.on(.next("3"))
observable2.on(.next("4"))
observable2.on(.completed) //observable2 emission has been completed here.
这将为您提供预期的输出,希望对您有所帮助:)