본문 바로가기

카테고리 없음

[RxSwift] Subject

안녕하세요 태태입니다. 💜 

오늘은 Subject에 대해서 알아보려고 합니다.

Subject 란? 

subject하나 이상의 Observable을 구독할 수 있으며 동시에 Observable이기도 하기 때문에 항목들을 하나 하나 거치면서 재방출하고 관찰하며 새로운 항목들을 방출할 수 있습니다.
즉, Observable이자 Observer인 것을 Subject라 합니다.

Subject 종류

subject는 총 4종류가 존재합니다.

- AysncSubject

- BehaviorSubject

- PublishSubject

- ReplaySubject
하나씩 알아보겠습니다.

 

1. AysncSubject

 > Observable이 완료된 후 가장 마지막 값만 방출합니다.

AysncSubject 마블다이어그램


만약, Observable이 오류로 인해서 종료될 경우 값을 방출하지 않고 오류를 전달합니다.

AysncSubject 마블 다이어그램(오류발생)

 

2. BehaviorSubject

초기 값(분홍색)을 가지며 이후 구독되는것에 대해서 최근 값을 방출.

구독되는 시점에 아무런 값을 방출하지 않는다면 가장 최근에 방출한 값을 전달 받습니다.

BehaviorSubject 마블 다이어그램


마찬가지로 만약 Observable이 오류로 종료되면 아무런 항목도 배출하지 않고 발생한 오류를 전달합니다.

BehaviorSubject 마블 다이어그램 (오류발생)


> 초기값 혹은 가장 최근값을 가지고 있으니 미리 데이터를 패치할때 유리합니다.
화면을 그리기전 준비해야할 데이터가 있을때 사용하면 유용하겠죠..?!

 

3. PublishSubject

초기값이 없으며 새로운 값만 subscribe에 방출
Observer가 각기 다른 시점에 구독한다면 구독되는 시점에 따라 이전것은 받지 못합니다. (값의 유실이 발생할 수 있음)
만약 모든 값을 전달받는 것을 보장해야한다면, Create를 사용해서 Cold Observable을 생성하거나, ReplaySubject를 사용해야합니다.

PublishSubject 마블 다이어그램

PublishSubject도 마찬가지로 오류 때문에 종료된다면 아무런 값을 방출하지 않고 오류를 전달합니다.

PublishSubject 마블 다이어그램 (오류발생)


> 구독 시점에 데이터를 가져오기 때문에, 실시간 데이터를 가져오는 구현을 해야할 때 유리합니다.

4. ReplaySubject
구독전에 버퍼 사이즈 만큼 값을 저장했다 구독 시 해당 사이즈만큼 값을 방출해주고 시작됩니다.

버퍼 사이즈가 0이라면 publishSubject와 같습니다.

 

ReplaySubject 마블 다이어그램

버퍼 사이즈가 있기 때문에 특정 개수만큼 데이터를 가져와서 보여주어야 할 경우 유리합니다.
만약, 버퍼사이즈를 초과하게 되면 오래된 항목들을 제거합니다.

버퍼는 메모리에 할당하기 때문에 버퍼크기를 잘 고려해야 메모리가 낭비되지 않습니다.

다음글은 각 Subject에 대한 예시 코드와 결과를 보도록 하겠습니다 !