首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在运行时“合并”可观察到的数据?

如何在运行时“合并”可观察到的数据?
EN

Stack Overflow用户
提问于 2015-09-16 21:51:48
回答 2查看 730关注 0票数 3

我的用例是在视图组中单击监听器:

  • 每个View都发布一个冷Observable<Click> API。
  • 视图组管理视图集合,并提供从子视图发出单击的Observable<ViewClick> API。

我希望每个子视图在添加到可观察的复合视图时被订阅,但前提是复合有订阅。如果没有,则应该只在订阅复合时才订阅子节点。

到目前为止,我的解决办法是:

代码语言:javascript
运行
复制
PublishSubject<ViewClick> composite;
Map<View, Subscription> subscriptions;

void addSource(View view, Observable<Click> clicks) {
    Subscription s = clicks.map(click -> new ViewClick(view, click)
     .subscribe(composite::onNext);
    subscriptions.put(view, s);
}

void removeSource(View v) {
    Subscription s = subscriptions.get(v);  
    s.unsubscribe;
    subscriptions.remove(v);  
}

Observable<ViewClick> compositeClicks() {
    return composite;
}

然而,这意味着clicks可观测值不再是冷的,因为它们被订阅了,而不管是否订阅了compositeClicks

有更好的办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-21 08:43:17

您的困难来自于这样一个事实: addSource/removeSource不是反应性的,如果您将它们变成Rx流,它们就会逃脱。

实现这一目标的几种方法:

  • IObservable<IObservable<View>>中,内部可观测值在激活/添加时将有一个单独的onNext,而在删除时将具有onComplete
  • IObservable<View> x2 (一个用于添加,一个用于删除)
  • IObservable<ViewActivationEvent> (带有添加/删除种类+视图实例的元组)

(假设可以从视图中提取单击流,否则需要为激活部分提供一个元组view+clickStream来代替视图)

下面是使用上面的#2实现您的流的方式,但是所有方法都可以工作:

代码语言:javascript
运行
复制
Subject<View> add,remove;

clicks = add.flatMap(view -> getClickObservable(view).takeUntil(remove.where(v => v == view)))
票数 0
EN

Stack Overflow用户

发布于 2015-09-17 06:58:08

您需要一个特殊的“温暖”主题,比如BufferUntilSubscriber,它保存着源的可观察性,直到单个用户订阅了它。不幸的是,该类不是官方API的一部分,但是,2.0将有一个官方的UnicastSubject,其目的完全相同:

代码语言:javascript
运行
复制
UnicastSubject<Observable<Integer>> inputs = UnicastSubject.create();

Observable<String> p = inputs
        .flatMap(v -> v.map(u -> u.toString()))
        .publish()
        .autoConnect()
        ;

inputs.onNext(Observable.just(1)
    .doOnSubscribe(s -> System.out.println("Subscribed to 1")));
inputs.onNext(Observable.just(2)
    .doOnSubscribe(s -> System.out.println("Subscribed to 2")));
inputs.onNext(Observable.just(3)
    .doOnSubscribe(s -> System.out.println("Subscribed to 3")));

System.out.println("Subscribing to p");

p.subscribe(System.out::println);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32619393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档