我遇到需要一个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);
我知道有合并运算符,但我需要一个可变结构。我错过了已经存在的东西吗?我宁愿不使用科目,除非它绝对适合这种情况。
答案 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)
}