올해는 머신러닝이다.
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 |