혼자 있고 싶네요. 모두 나가주세요.
004. RxJava Subject란? 본문
Subject
subject는 Observer나 Observable처럼 행동하는 ReactiveX의 일부 구현체에서(ex. RxJava) 사용 가능한 연결다리 혹은 프록시이다. Subject는 Observer이기 때문에 하나 이상의 Obervable들을 구독할 수 있고 또한 Observable이기 때문에 아이템들을 하나 하나 거치면서 재배출하고 새로운 아이템을 배출할 수도 있다.
한 Subject는 한 Observable을 구독하므로써 (Cold Observable인 경우에만 - (Hot, Cold Observable)) Observable이 아이템을 배출하도록 만든다. 이것은 Subject를 Cold Obervable에서 Hot Observable로 만드는 효과를 낼 수 있다.
Subject의 종류
네가지 종류의 특정한 상황에 맞게 설계된 Subject들이 있다. 모든 ReactiveX 구현체에서 사용 할 수 있는 것이 아니다.
AsyncSubject
AsyncSubject
는 소스 Observable로부터 얻은 마지막 값을 배출하고 소스 Observable의 동작이 완료된 후에야 동작한다. (만약, 소스 Observable이 아무 값도 배출하지 않으면 AsyncSubject 역시 아무 값도 배출하지 않는다.) 만약 소스 Observable이 오류를 발생하면AsyncSubject
는 아무 항목도 배출하지 않고 오류를 그대로 전달한다.
BehaviorSubject
- Observer가
BehaviorSubject
를 구독하기 시작하면, Observer는 소스 Observable이 가장 최근에 발행한 항목(또는 아직 아무 값도 발행되지 않았다면 맨 처음 값이나 기본 값)의 발행을 시작하며 그 이후 소스 Observable(들)에 의해 발행된 항목들을 계속 발행한다. 만약 소스 Observable이 오류를 발생하면BehaviorSubject
는 아무 항목도 배출하지 않고 오류를 그대로 전달한다.
- Observer가
PublishSubject
PublishSubject
는 구독 이후에 소스 Observable들이 배출한 항목들만 옵저버에게 배출한다. 주의할 점은,PublishSubject
는 (이를 막지 않는 이상) 생성 시점에서 즉시 항목들을 배출하기 시작할 것이고 이런 특성 때문에 주제가 생성되는 시점과 옵저버가 이 주제를 구독하기 시작하는 그 사이에 배출되는 항목들을 잃어 버릴 수 있다는 단점이 있다. 따라서, 소스 Observable이 배출하는 모든 항목들의 배출을 보장해야 한다면 Create을 사용해서 명시적으로 "차가운" Observable(항목들을 배출하기 전에 모든 옵저버가 구독을 시작했는지 체크한다)을 생성하거나,PublishSubject
대신ReplaySubject
를 사용해야 한다.
ReplaySubject
ReplaySubject
는 옵저버가 구독을 시작한 시점과 관계 없이 소스 Observable(들)이 배출한 모든 항목들을 모든 옵저버에게 배출한다.ReplaySubject
는 몇 개의 생성자 오버로드를 제공하는데 이를 통해, 재생 버퍼의 크기가 특정 이상으로 증가할 경우, 또는 처음 배출 이후 지정한 시간이 경과할 경우 오래된 항목들을 제거한다. 만약,ReplaySubject
을 Observer로 사용할 경우, 멀티 스레드 환경에서는 Observable 계약 위반과 주제에서 어느 항목 또는 알림을 먼저 재생해야 하는지 알 수 없는 모호함이 동시에 발생할 수 있기 때문에 (비순차적) 호출을 유발시키는 onNext(또는 그 외 on) 메서드를 사용하지 않도록 주의해야 한다.
RxJava에서의 사용
만약 Subject를 Subscriber 인터페이스 없이 다른 agent로 전달하고 싶다면, 그 Subject를 순수 Observable을 리턴하게 하는 asObservable method를 사용하면 된다.
'타닥타닥 > RxJava' 카테고리의 다른 글
006. RxJAVA 연산자 :: Observable 생성 (0) | 2017.07.12 |
---|---|
005. Connectable Observable (0) | 2017.07.05 |
003. Observable : Hot, Cold? (0) | 2017.07.05 |
002. RxAndroid 준비하기 (0) | 2017.07.05 |
001. Reactive Programming/RxJava 란? (0) | 2017.07.05 |
Comments