RxJava - 可以随时接受更多Observable的Merged Observable?

时间:2016-07-21 02:02:44

标签: rx-java reactive-programming

我遇到需要一个Observable实现,它包含一个或多个Observable并合并它们。但是这里是踢球者:我想添加更多的Observables随时可以合并,我想它也可以支持删除它们。

为了使其真正有效,所有订阅者必须接收来自订阅后添加的新Observable的通知。除非所有合并的Observable都很冷并且调用onComplete(),否则即使添加了更多的Observable,我也可以让订阅取消订阅。这更适用于合并多个无限热Observable并能够随时添加更多。

MergableObservable<MyEvent> allSources = new MergableObservable<>();

//later in application
Observable<MyEvent> eventSource1 = ...
allSources.add(eventSource1);

//and later again
Observable<MyEvent> eventSource2 = ...
allSources.add(eventSource2 );

//and so on
Observable<MyEvent> eventSource3 = ...
allSources.add(eventSource3);

我知道有合并运算符,但我需要一个可变结构。我错过了已经存在的东西吗?我宁愿不使用科目,除非它绝对适合这种情况。

2 个答案:

答案 0 :(得分:2)

您无法避免使用主题,因为您想要手动推送新的Observable来源,而不是“自然地”生成它们。

Subject<Observable<T>, Observable<T>> o = PublishSubject
    .<Observable<T>>create().toSerialized();

ConcurrentHashSet<Observable<T>> live = ...

o.flatMap(v -> v.takeWhile(x -> live.containsKey(v))).subscribe(...);

Observable<T> inner = ...
live.add(inner);
o.onNext(inner);

//...

live.remove(inner);

答案 1 :(得分:0)

也许主题是处理此问题的最合理方式。如果有人知道更好的方法,我会对其他答案持开放态度。有点杀了我没有内置的方法来做到这一点。我想这将是一个普遍的需求。

Kotlin实施

class MergingObservable<T> {

    private val subject: SerializedSubject<T, T> = PublishSubject<T>().toSerialized()

    fun toObservable(): Observable<T> = subject

    operator fun plusAssign(observable: Observable<T>) {
        add(observable)
    }

    fun add(observable: Observable<T>): Subscription = observable.subscribe(subject)
}