Andrew Paul Simmons
Andrew Paul Simmons

Reputation: 4513

In RxSwift how can I set up a Subject to observe another Observable?

Let's say I have the following:

let theSubject = PublishSubject<String>()
let theObservable = Observable.just("Hello?")

How do I set the theSubject to observer theObservable?

In RxSwift we say that a subject is an observer and can subscribe to one or more Observables...

Can you show a simple code example of how I can connect theSubject as an observer of theObservable ?

Upvotes: 10

Views: 8877

Answers (2)

Daniel T.
Daniel T.

Reputation: 33967

The code is:

theObservable
    .bind(to: theSubject)
    .disposed(by: bag)

or:

theObservable 
    .subscribe(theSubject)
    .disposed(by: bag)

If you only do subscribe(onNext:) as others have suggested, only the onNext events will get passed along. You should use bind to pass everything along.

(But really you probably shouldn't use a subject. Instead bind the thing(s) that are listening to the subject to the Observable directly.

Upvotes: 15

E-Riddie
E-Riddie

Reputation: 14780

The answer is

theObservable
    .subscribe(onNext: { theSubject.onNext($0) })
    .disposed(by: disposeBag)

This will make sure that every time that the theObservable emits, the value will be passed to theSubject too.

Note This only passes the value onNext, if you want to handle all the cases, then use bind(to:) as the answer by Daniel T. (or drive for Drivers)

Example with more Observables

In the following example values from different Observables will be passed to theSubject

let theSubject = PublishSubject<String>()
let theObservable = Observable.just("Hello?")
let anotherObservable = Observable.just("Hey there")

theSubject.asObservable()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

theObservable
    .subscribe(onNext: { theSubject.onNext($0) })
    .disposed(by: disposeBag)

anotherObservable
    .subscribe(onNext: { theSubject.onNext($0) })
    .disposed(by: disposeBag)

Output

The subject

Upvotes: 9

Related Questions