如何不仅重播序列中的最后一项,而且重播每组中的最后一项?

时间:2015-08-11 10:00:36

标签: rx-java rx-android

我有一个热门观察者发出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,但我不想在内存中保留所有项目。我无法将ReplaySubjectcapacity一起使用,因为我需要为整个序列设置容量,但是为每个组设置容量。

我看到的唯一解决方案是将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))
                        )
        );

问题

  1. 我选择了正确的方法吗?你能指点我更简单的解决方案吗?
  2. 我是对的,我应该致电mTestSubscription.unSubscribe()mCompositeSubcription.unSubscribe
  3. 当我的InitialHotObservable完成时,我应该以某种方式处理BehaviorSubject's
  4. 更新

    我可以使用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();
    

    在这种情况下,我不知道应该在unsibcribeobservable.connect();订阅上明确调用mConnectableObservable.connect();

0 个答案:

没有答案