티스토리 뷰

RxSwift

[RxSwift] Subject

Hani_Levenshtein 2021. 7. 7. 23:46

안녕하세요 Hani입니다.

오늘은 Subject에 대하여 알아볼 거예요.

 

간단히.. 정말 간단히 🙏

 

 

Subject는 Observable와 Observer의 성격을 둘 다 가지고 있는 놈입니다.

 

 

각 역할을 짧게 말하면 Observable은 Observer에게 event를 전달하고, 

Observer는 Observable을 subscribe하여 들어오는 event에 대한 처리를 합니다.

 

Subject는 Observable와 Observer의 역할을 동시에 수행할 수 있기 때문에,

Observer로서 하나 이상의 Observable를 subscribe할 수 있고,

Observable로서 event를 전달할 수 있습니다.

 

 

RxSwift가 제공하는 Subject에는 4가지 종류가 있는데,

하나 씩 알아보겠습니다. 🧐


AsyncSubject

Observer가 AsyncSubject를 Subscribe하면 AsyncSubject가 마지막으로 방출하는 event+complete을 방출합니다.

 

 

Observer가 AsyncSubject를 subscribe할 때 만약 error로 종료된다면 error event만을 전달합니다.


BehaviorSubject

BehaviorSubject는 지정된 초기 값(보라색 Marble)을 가지고 있습니다.

 

Observer가 BehaviorSubject를 Subscribe한 시점에

당장 BehaviorSubject가 아무런 값도 갖고 있지 않다면 초기 값을 전달하고,

값을 가지고 있다면 가장 마지막에 발생한 event를 전달합니다.

 

이후, completed/error로 종료 될 때까지 BehaviorSubject를 subscribe하고 있는 모든 Observer에게 event를 전달합니다.

 

만약 error로 종료된 BehaviorSubject를 Observer가 Subscribe하면 error event만을 전달합니다.


PublishSubject

PublishSubject는 BehaviorSubject와 달리 초기 값이 없습니다.

 

Observer가 PublishSubject를 subscribe한 시점 이전의 event도 받을 수 없습니다.

오직 subscribe을 한 시점 이 후에 PublishSubject이 방출한 event만 Observer에게 전달합니다.

 

이후, completed/error로 종료 될 때까지 PublishSubject를 subscribe하고 있는 모든 Observer에게 event를 전달합니다.

 

 

Observer가 subscribe한 PublishSubject가 error로 종료되면 error를 전달하고 끝냅니다.

 


ReplaySubject

ReplaySubject는 Observer가 subscribe한 시점에 관계없이, ReplaySubject이 방출하는 모든 event를 Observer에게 방출합니다.

사이즈 n의 버퍼를 설정해두면 subscribe한 시점에서 가장 최근 n개의 event만 Observer에게 전달합니다.

 


References

http://reactivex.io/documentation/subject.html

 

댓글