我有一个热门观察者发出Pair<key,value>
。我需要每个新订阅者为每个value
和所有后续项目收到最后key
。
实施例。 Observable发出以下序列:
Time point 0.
Pair<0,1>
Pair<0,2>
Pair<1,0>
Pair<1,1>
Time point 1. Subscriber A subscribes
Pair<0,3>
Pair<1,2>
Time point 2. Subscriber B subscribes
Pair<2,1>
订阅者A应该看到:
Pair<0,2>
Pair<1,1>
Pair<0,3>
Pair<1,2>
Pair<2,1>
订阅者B应该看到:
Pair<0,3>
Pair<1,2>
Pair<2,1>
最初我在考虑ReplaySubject
,但我不想在内存中保留所有项目。我无法将ReplaySubject
与capacity
一起使用,因为我需要为整个序列设置容量,但是为每个组设置容量。
我看到的唯一解决方案是将Observable<Pair<key,value>>
转换为Observable<Observable<Pair<key,value>>>
,如下所示:
mConnectableObservable = InitialHotObservable //emits items Pair<key,value>
.groupBy(pair -> pair.first)
.map(groupedObservable -> {
Subject<Pair<Integer, Integer>, Pair<Integer, Integer>> subject = BehaviorSubject.create();
groupedObservable.subscribe(subject::onNext);
return subject.asObservable();
})
.replay();
mConnectableObservable.connect();
对此可观察量的订阅将如下所示:
mCompositeSubcription = new CompositeSubscription();
mTestSubscription = mCountDownPresenter.start2()
.subscribe(pairObservable ->
mCompositeSubcription.add(
pairObservable
.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> doSomething(pair))
)
);
问题
mTestSubscription.unSubscribe()
和mCompositeSubcription.unSubscribe
?InitialHotObservable
完成时,我应该以某种方式处理BehaviorSubject's
更新
我可以使用BehaviorSubject
replay
mConnectableObservable = InitialHotObservable //emits items Pair<key,value>
.groupBy(pair -> pair.first)
.map(groupedObservable -> {
ConnectableObservable<Pair<Integer,Integer>> observable = groupedObservable.asObservable().replay(1);
observable.connect();
return observable.asObservable();
})
.replay();
mConnectableObservable.connect();
在这种情况下,我不知道应该在unsibcribe
和observable.connect();
订阅上明确调用mConnectableObservable.connect();
。