오늘도 공부
Rx에서의 멀티캐스팅 방법 본문
출처 : http://blog.danlew.net/2016/06/13/multicasting-in-rxjava/
멀티 캐스팅은 RxJava에서 중복 된 작업을 줄이기위한 핵심 방법입니다.
당신이 이벤트를 멀티 캐스트하면 보내 같은 이벤트를 모두 다운 스트림 사업자 / 가입자. 이 기능은 네트워크 요청과 같이 값 비싼 작업을 수행 할 때 유용합니다. 각 가입자마다 똑같은 네트워크 요청을 반복적으로 실행하고 싶지는 않습니다. 결과를 멀티 캐스팅하기 만하면됩니다.
멀티 캐스트에는 두 가지 방법이 있습니다.
- 를 사용 
ConnectableObservable을 통해 (publish()또는replay()1 ) - 사용 
Subject 
ConnectableObservable또는 전에 수행 된 Subject작업은 한 번만 발생합니다. 그런 다음 해당 작업은 모든 다운 스트림에 멀티 캐스트 Subscribers됩니다.
: 당신이 인식해야 여기에 미묘한 지점이 스트림 만의 시점에서 멀티 캐스트 ConnectableObservable또는Subject . 그 결과, 멀티 캐스트 후에 수행하는 작업에 따라 복제된다 Subscriber.
이것이 어떻게 작동하는지 예를 들어 보겠습니다.
Observable<String> observable = Observable.just("Event")  
    .publish()
    .autoConnect(2)
    .map(s -> {
      System.out.println("Expensive operation for " + s);
      return s;
    });
observable.subscribe(s -> System.out.println("Sub1 got: " + s));  
observable.subscribe(s -> System.out.println("Sub2 got: " + s));
// Output:
// Expensive operation for Event
// Sub1 got: Event
// Expensive operation for Event
// Sub2 got: Event
여기서 우리는이 ConnectableObservable, 고가의 map()운영 및 두 Subscribers. 놀라운 결과는 고가 인 것이 map()작업 실행 회 우리가 것을 방지하려하더라도 publish()!
이 차트는 상황을 더 명확하게 만듭니다.

당신이 실제로 원하는 경우 map()한 번 일이, 당신은 그것을 넣을 필요가 전에publish()전화 :
Observable<String> observable = Observable.just("Event")  
    .map(s -> {
      System.out.println("Expensive operation for " + s);
      return s;
    })
    .publish()
    .autoConnect(2);
observable.subscribe(s -> System.out.println("Sub1 got: " + s));  
observable.subscribe(s -> System.out.println("Sub2 got: " + s));
// Output:
// Expensive operation for Event
// Sub1 received: Event
// Sub2 received: Event
업데이트 된 차트는 다음과 같습니다.

여기에 무슨 교훈이 있니? 작업량을 줄이기 위해 멀티 캐스팅에 의존한다면 올바른 시점에서 멀티 캐스팅해야합니다.
좋든 나쁘 든 들어, 많은 사람들이 사용하고 있습니다 Subjects. 하나의 장점은 멀티 캐스트하지만 당신은 그들이 것을 기억해야한다는 것입니다 만 그들이 방출 지점에서 멀티 캐스트. 당신이 비싼 사업자의 무리가 하류의 적용이 있다면 Subject당신은 다른 추가하는 것을 고려한다 publish()하류 어딘가에.
1 share() 및cache()도 옵션입니다,하지만 그들은 기본적으로 그냥 주위에 바로 가기ConnectableObservable. share()그냥publish().refCount()및cache()사용하여 재 작성 할 수 있습니다replay().autoConnect().
'Android > RXAndroid' 카테고리의 다른 글
| Easy SQLite on Android with RxJava (0) | 2017.02.21 | 
|---|---|
| Rx 예제모음 (0) | 2017.02.21 | 
| MissingBackpressureException 설명 (0) | 2017.02.03 | 
| Flowable 를 언제 사용하면 될까? (0) | 2017.02.03 | 
| RxJava 예제 (0) | 2017.01.31 | 
