RxSwift

RxSwift의 Subject에 대해 알아보자

TaeJoongYoon 2019. 3. 23. 13:58

RxSwift에는 다양한 Subject들이 있다.

각각 어떤 요소들인지 알아보고 정리해볼 필요가 있다고 느꼈다!

# RxSwift의 Subject에 대해 알아보자


먼저 Subject가 뭔지 알아보자.
Subject는 쉽게 말해 Observer와 Observable의 역할을 같이 할 수 있는 존재이다.
Observer의 역할로써 Observable을 구독할 수 있고 Observable의 역할로써 이벤트를 발행할 수 있다..!!


현재 RxSwift에는 4가지 Subject가 있다.


1. AsyncSubject

2.BehaviorSubject

3.PublishSubject

4.ReplaySubject


하나씩 알아보자!!



1. AsyncSubject


Observable의 마지막 값만 발행하고 Observable이 Complete된 이후에 동작한다.



아무 이벤트가 발생하지 않으면 당연히 AsyncSubject 역시 아무 값도 발행하지 않고

Observable이 Error를 발행하면 AsyncSubject 도 Error를 발행한다.




---------------------------------------------------------------------------------


2. BehaviorSubject


Observable이 가장 최근에 발행한 값 (값이 없다면 기본값)을 가지고 시작하며

Observable에 의해 발행된 값들을 계속 발행한다.




만약 Observable이 Error를 발생시키면 BehaviorSubject는 아무런 항복도 발행하지 않고

Error를 그대로 전달한다.





---------------------------------------------------------------------------------


3. PublishSubject


Observable을 구독한 이후부터 동작하여 Observable에 의해 발행된 값들을 계속 발행한다.

(BehaviorSubject와는 다르게 초기 값이 없다.)



주의할 점은, PublishSubject 의 생성 시점과 Observer가 구독하는 시점 사이에 발행되는 이벤트들을

잃어 버릴 수 있다는 점이 있다.

Observable의 모든 항목들의 발행을 보장해야 한다면 Create를 사용하여 Cold Observable을 생성하거나

ReplaySubject를 사용한다.




---------------------------------------------------------------------------------


4. ReplaySubject


n 사이즈의 버퍼를 가지고 있고 Observer가 구독을 한 이전 버퍼사이즈만큼의 발행된 이벤트 역시

Observer에게 발행한다.





---------------------------------------------------------------------------------


그리고 Variable이 있는데 이건 BehaviorSubject와 비슷하지만 

일반 변수처럼 사용할 수 있는 존재인 것 같습니다!

 

(현재 버전에서는 Variable대신 BehaviorRelay를 사용한걸 권장하는 것 같습니다)





정리를 해보면 큰 기능은 비슷하고 구독시점부터 몇 개의 이벤트를 가지고 시작하냐의 차이가 존재하는 것 같습니다.


 AsyncSubject = 0

PublishSubject = 0

BehaviorSubject, BehaviorRelay = 1

ReplaySubject = N


Reference


ReactiveX - Subject




아직 모르는 것이 많고 알아가는 과정입니다.

잘못된 것이 있다면 댓글로 남겨주신다면 감사하겠습니다! 😊