Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

혼자 있고 싶네요. 모두 나가주세요.

004. RxJava Subject란? 본문

타닥타닥/RxJava

004. RxJava Subject란?

아무것도몰라양 2017. 7. 5. 19:06

참조 : [http://reactivex.io/documentation/subject.html]

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
    • AsyncSubject는 소스 Observable로부터 얻은 마지막 값을 배출하고 소스 Observable의 동작이 완료된 후에야 동작한다. (만약, 소스 Observable이 아무 값도 배출하지 않으면 AsyncSubject 역시 아무 값도 배출하지 않는다.) 만약 소스 Observable이 오류를 발생하면 AsyncSubject는 아무 항목도 배출하지 않고 오류를 그대로 전달한다.
  • BehaviorSubject BehaviorSubject
    • Observer가 BehaviorSubject를 구독하기 시작하면, Observer는 소스 Observable이 가장 최근에 발행한 항목(또는 아직 아무 값도 발행되지 않았다면 맨 처음 값이나 기본 값)의 발행을 시작하며 그 이후 소스 Observable(들)에 의해 발행된 항목들을 계속 발행한다. 만약 소스 Observable이 오류를 발생하면 BehaviorSubject는 아무 항목도 배출하지 않고 오류를 그대로 전달한다.
  • PublishSubject PublishSubject
    • PublishSubject는 구독 이후에 소스 Observable들이 배출한 항목들만 옵저버에게 배출한다. 주의할 점은, PublishSubject는 (이를 막지 않는 이상) 생성 시점에서 즉시 항목들을 배출하기 시작할 것이고 이런 특성 때문에 주제가 생성되는 시점과 옵저버가 이 주제를 구독하기 시작하는 그 사이에 배출되는 항목들을 잃어 버릴 수 있다는 단점이 있다. 따라서, 소스 Observable이 배출하는 모든 항목들의 배출을 보장해야 한다면 Create을 사용해서 명시적으로 "차가운" Observable(항목들을 배출하기 전에 모든 옵저버가 구독을 시작했는지 체크한다)을 생성하거나, PublishSubject 대신 ReplaySubject를 사용해야 한다.
  • 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