PublishSubject调用每个当前观察者的映射

时间:2015-07-17 17:02:57

标签: reactive-programming rx-java

我正在使用PublishSubjectmap运算符:

@Test
public void testMapWithMultipleObservers() {

    PublishSubject<Integer> subject = PublishSubject.create();
    Func1 action = spy(new Func1<Integer, Integer>() {
        @Override
        public Integer call(Integer integer) {
            return integer;
        }
    });
    Observable<Integer> observable = subject.asObservable().map(action);

    observable.subscribe(mock(Observer.class));
    observable.subscribe(mock(Observer.class));

    subject.onNext(1);

    verify(action, times(2)).call(anyInt());
    // however, I need it to be times(1)

}

所需的行为是在主题产生值后执行操作。我已经尝试了doOnEachdoOnNextmap,并且在每种情况下都会为每个当前观察者执行操作(对于100个观察者,操作将执行100次),而我需要它按发射执行。

你能提出什么建议吗?

感谢。

1 个答案:

答案 0 :(得分:1)

最快的选择是使用share()

Observable<Integer> observable = 
    subject
        .map(action)
        .share();

您不需要asObservable()调用。它用于从API返回主题并阻止调用者将其强制转换回主题。例如:

Observable<Integer> getSubjectAsObservable() {
    return subject.asObservable();
}