상세 컨텐츠

본문 제목

RxSwift. Ch 3. Subjects

TIL/RxSwift

by box-jeon 2020. 4. 18. 22:16

본문

What are subjects?

What you want is something that can act as both an observable and as observer. And that something is called a Subject.

별 생각없이 만들어서 binding하고 zip하며 한참 써오다가, 다시 읽으니 그 개념이 확 다가옵니다. RxSwift에서 제공하는 4종류의 Subject를 소개하고 그 wrapper인 Relay가 이어서 소개됩니다.

PublishSubject

Empty 상태로 시작하며 새로운 element가 들어오면 그대로 방출합니다. Observer는 subscribe 이후에 발생하는 이벤트만 받게 됩니다.

BehaviorSubject

초기값을 가진 상태로 시작하며 새로운 element가 들어오면 상태값을 업데이트한 후 그대로 방출합니다. Observer는 subscribe과 동시에 가장 최근에 방출된 element를 먼저 받고, 이후에 발생하는 이벤트들을 받게 됩니다.

ReplaySubject

지정된 사이즈만큼의 버퍼를 가지며 새로운 element가 들어오면 버퍼에 순서대로 넣은 후 그대로 방출합니다. 버퍼가 가득 찬 경우 가장 오래된 element를 제거합니다. Observer는 subscribe과 동시에 버퍼에 채워져있는 모든 element를 먼저 받고, 이후에 발생하는 이벤트들을 받게 됩니다.

AsyncSubject

Subject가 .completed 이벤트를 받을 경우, 가장 마지막 .next 이벤트를 방출합니다. 거의 사용되지 않습니다. 그렇다면 .next 이후에 .completed는 과연 오는지 궁금해지는데, 실험해보니 잘 옵니다. 다만 .completed를 받은 후에 subscribe할 경우, subscribe과 동시에 .next 이벤트와 .completed 이벤트를 받습니다.

PublishRelay and BehaviorRelay

.next 이벤트만 방출하며 .completed 이벤트나 .error 이벤트는 방출하지 않습니다. 즉, 종료되지 않습니다. 이를 제외하면 PublishRelay는 PublishSubject와 동일하게 동작합니다. BehaviorRelay도 BehaviorSubject와 동일하게 동작하는데, 다만 value라는 프로퍼티를 통해 subscribe 없이도 가장 최근에 방출된 element를 얻어낼 수 있습니다.

 

관련글 더보기

댓글 영역