为什么 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.

这将为您提供预期的输出,希望对您有所帮助:)