A Subject is a sort of bridge or proxy that is available in some implementations of ReactiveX that acts both as an observer and as an Observable.
Because it is an observer, it can subscribe to one or more Observables, and because it is an Observable, it can pass through the items it observes by reemitting them, and it can also emit new items.
Because a Subject subscribes to an Observable, it will trigger that Observable to begin emitting items (if that Observable is “cold” — that is, if it waits for a subscription before it begins to emit items). This can have the effect of making the resulting Subject a “hot” Observable variant of the original “cold” Observable.
- ReactiveX Doc
중요 포인트만 짚어보자.
✅ Subject는 Observer나 Observable처럼 행동하는 ReactiveX •••
✅ Subject는 Observer이기 때문에 하나 이상의 Observable을 구독할 수 있으며 동시에 Observable이기도 하기 때문에 item들을 하나 하나 거쳐가면서 reemitting하고 Observe하여 새로운 item을 emit할 수 있다.
✅ 차가운 Observable : Subscribe되어야만 item을 emit하는 Observable
✅ 뜨거운 Observable : Subscribe 여부와 상관 없이 item을 emit하는 Observable
✏️ 여기서 키포인트는 Subject는 Observer이며 동시에 Observable이기도 하다 !
Cold Observable
지금까지 공부한 Operator들은 Observable을 생성한다고 해서 바로 item을 emit하지 않는다.
✅ 해당 Observable을 subscribe했을 때 item을 emit한다.
즉, Cold Observable은 Subscribe 되어야만, 그 시점에 item을 emit하는 Observable이다.
let observable = Observable.just("item")
위의 예제코드 처럼 observable을 생성한다고 해서 바로 item을 emit하지 않는다.
observable.subscribe(onNext: { item in
print(item)
}, onCompleted: {
print("onCompleted!")
}, onDisposed: {
print("onDispose!")
}).dispose()
위의 예제코드 처럼 subscribe해야 item을 emit한다. 이것이 바로 Cold Observable이다.
Hot Observable
Replay, Behavior, AsyncSubject가 있지만, PublishSubject로 간단한 예를 들어보겠다.
let subject = PublishSubject<String>()
위의 예제코드처럼 subject 객체를 생성한다. 여기서 Cold Observable과의 차이점은, Cold Observable은 Observable.just("item")과 같이 어떤 item을 emit할지 정의한다. 하지만 Hot Observable은 어떤 item을 emit할지 정의하지 않는다.
즉, 개발자가 원하는 시점마다 item을 방출할 수 있다.
위의 코드를 실행하면
위의 결과를 얻게 된다. 왜 그런지는 PublishSubject에서 다루도록 하고, Subject는 Observer가 구독하는 "시점"에 따라서 item을 emit함에 집중하자.
'iOS > RxSwift' 카테고리의 다른 글
[iOS/RxSwift] RxSwift 완벽 정리 - 1 (1) | 2024.03.07 |
---|---|
[iOS/RxSwift] Next, Error, Completed 처리하기 (0) | 2024.02.03 |
[iOS/RxSwift] Operators - Map, Filter (0) | 2024.02.03 |
[iOS/RxSwift] Operators - 생성 연산자 (create, just, of, from) (1) | 2024.02.03 |
[iOS/RxSwift] Marble Diagram (0) | 2024.02.01 |