본문 바로가기
IOS

[iOS] RXswift (3) - Subject

by eigen96 2022. 5. 13.
728x90

참고 : https://reactivex.io/documentation/subject.html

 

ReactiveX - Subject

If you have a Subject and you want to pass it along to some other agent without exposing its Subscriber interface, you can mask it by calling its asObservable method, which will return the Subject as a pure Observable. See Also

reactivex.io

Observable이면서 Observer의 역할이 가능한 Subject

 

Subject 종류

  • PublishSubject : 빈상태로 시작하여 새로운 값 만을 Subscriber에 방출
  • BehaviorSubject : 하나의 초기값을 가진 상태로 시작하여, 새로운 Subscriber에게 초기값 또는 최신값을 방출
  • ReplaySubject : 버퍼를 두고 초기화 하며, 버퍼 사이즈 만큼의 값들을 유지하면서 새로운 Subscriber에게 방출

공식문서에 나오는 marble diagram을 보면서 이해해보겠습니다.

PublishSubject는 구독, 좋아요 등 새로운 이벤트를 알릴때 용이하다고 해요.

다이어그램의 첫번째 줄은 subject를 배포한 것입니다.

이 Subject를 바라보는 두번째와 세번째 줄이 Subscriber들입니다.

아래 화살표는 이벤트 방출, 위쪽 화살표는 subscribe(구독)입니다.

 

BehaviorSubject는 새로운 구독자에게 반복한다는 점 빼고는 위 PublishSubject와 비슷합니다.

처음 설명한 그림과 같이 첫번째 줄이 BehaviorSubject를 배포한 것입니다.

두번째 세번째 줄은 구독자입니다.

PublishSubject와 다른점은 연두색공 이벤트가 발생한 직후 세번째 줄의 구독자가 구독을 하였지만

바로 직전의 값을 받고 있는 모습을 볼 수 있습니다.

 

ReplaySubject는 Subject를 생성할 때 선택한 특정크기까지 방출하는 최신요소를 일시적으로 캐시하거나 버퍼로 둡니다.

버퍼로 둔 것을 구독자가 생길때마다 방출합니다.

Subject의 버퍼 사이즈를 2라고 둔다고 가정하겠습니다.

첫번째 구독자(2번째 줄)는 첫 이벤트 전에 구독하였기에 그대로 모든 값을 받았습니다.

두번째 구독자는(3번째줄) 연두색 이벤트가 방출된 이후 구독을 시작하였습니다.

그렇지만 버퍼사이즈가 2이기 때문에 2만큼의 값을 받을 수 있습니다. 뒤늦게 구독하였음에도 빨간 공 연두색 공의 이벤트를 받는 것을 그림에서 볼 수 있습니다. 

 

ReplaySubject 사용시 주의할 점은 버퍼들이 메모리를 가지기에 메모리 부하를 신경써야할 것입니다.

 

 

예제

1. PublishSubject

위 예제의 출력결과를 보면 PublishSubject이므로 두 구독자 모두 구독 시점이전의 이벤트는 받아들이지 못하는 것을 알 수 있습니다. 

그리고 Subject자체가 Completed된 시점이후인 last event는 받아볼 수 없는 것을 알 수 있습니다.

 

2. PublishSubject

3. ReplaySubject

처음에 보았던 마블 다이어그램과 같이 출력되는 것을 알 수 있습니다.

버퍼사이즈를 1로 줄인 출력결과를 보겠습니다.

728x90

'IOS' 카테고리의 다른 글

[iOS] RXswift(5) - Combining Operator - 에이젠  (0) 2022.05.14
[iOS] RXswift (4) - Opeartor  (0) 2022.05.13
[iOS] RXswift (2) - Traits  (0) 2022.05.13
iOS) RXswift란? - Observable  (0) 2022.05.12
iOS) UIImagePickerController  (0) 2022.05.11

댓글