Почему RxSwift concat с несколькими наблюдаемыми не работает? - PullRequest
2 голосов
/ 06 февраля 2020

Мой 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

Что мне не хватает и что я могу добавить / изменить, чтобы получить ожидаемый результат?

Ответы [ 2 ]

1 голос
/ 15 февраля 2020
    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.

Это даст вам ожидаемый результат, я надеюсь, что это поможет:)

1 голос
/ 06 февраля 2020

Вы излучаете «3» и «4» до того, как concat подпишется на observable2. concat еще не подписался на observable2, потому что он ожидает завершения observable1. К тому времени, когда concat подписывается на observable2, события «3» и «4» исчезают.

Как аналогия: представьте, что у вас есть два человека, которые бросают шары, и у вас есть один ловец. Вы сказали ловцу поймать все шары от первого метателя, а затем переключиться на второго метателя. Первый метатель бросает два мяча в ловушку, второй метатель бросает два мяча никому, потому что ловец ждет, чтобы увидеть, собирается ли первый метатель бросать больше шаров. Затем первый метатель говорит ловцу, что он бросил шары. Ловец тогда начинает наблюдать за вторым метателем, который говорит, что он также сделал. В конце концов, улавливатель поймал только два шара.

Если бы вы превратили observable2 в ReplaySubject, у которого был достаточно большой буфер, он воспроизвел бы все события, полученные для каждого подписчика, и вы бы получите желаемый результат.

...