2 votes

Pourquoi le concat de RxSwift avec plusieurs observables ne semble pas fonctionner ?

Mon RxSwift Le code est,

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)
}

La sortie actuelle est,

1
2

Le résultat que j'attends est le suivant,

1
2
3
4

Qu'est-ce que je manque et qu'est-ce que je peux ajouter/modifier pour obtenir le résultat attendu ?

1voto

Daniel T. Points 11250

Vous émettez "3" et "4" avant que le concat ne se soit abonné à l'observable2. Le concat ne s'est pas encore abonné à l'observable2 parce qu'il attend que l'observable1 soit terminé. Au moment où Concat s'abonne à l'observable2, les événements "3" et "4" ont disparu.

Par analogie, imaginez que vous avez deux personnes qui lancent des balles et que vous avez un receveur. Vous avez demandé au receveur d'attraper toutes les balles du premier lanceur, puis de passer au deuxième lanceur. Le premier lanceur lance deux balles à l'attrapeur, le second lance deux balles à personne parce que l'attrapeur attend de voir si le premier lanceur va lancer d'autres balles. Ensuite, le premier lanceur dit au receveur qu'il a fini de lancer des balles. Le receveur commence alors à regarder le deuxième lanceur, qui lui aussi dit qu'il a fini. Au final, le receveur n'a attrapé que deux balles.

Si vous deviez transformer l'observable2 en une ReplaySubject qui avait un tampon assez grand, alors il rejouerait tous les événements qu'il a reçus pour chaque abonné et vous obtiendriez la sortie que vous vouliez.

1voto

Vipul Kumar Points 48
    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.

Cela vous donnera le résultat attendu, j'espère que cela vous aidera :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X