当可观察的B发出一个项目时,从可观察的A发出/执行

时间:2016-08-25 08:34:12

标签: android rx-java

我有一个不完整的Observable A.我需要在A发生变化时从另一个Observable B发出。

例如。

//Stream of changed items
Observable<Item> a;
//Completing observable which provides list of items
Observable<List<Item>> b;

/**
 * Returns a non-completing Observable of all new and updated items.
 */
@NonNull
public Observable<T> getStream() {
   //Implementation here
}



/**
*Returns a non-completing observable of the list
*/

//My implementation
public void Observable<List<Item>> getListStream(){
   return getStream().flatMap(item->getAll());

}


/**
*Returns a completing observable of the list of all items
*/
public void getAll(){
 //Implementation here
}

这里B是一个完整的观察者。

这是来自Reark github project

SingleItemContentProviderStore.java

这种方法的问题是: getStream()返回一个发出upserted项的observable,因此每次列表发生更改时都会调用getAll方法。这意味着向列表中添加100个项目,触发getListStream()可观察100次。我明白这种方法是错误的,有没有更好的方法?

2 个答案:

答案 0 :(得分:0)

如果B正在完成,那么我想它应该有签名Observable<Observable<List<Item>>>

Observable<Observable<List<Item>>> b = a.map(ignored -> getListStream())

然后可以使用如下:

b.subscribe(obs -> obs.subscribe(itemsList -> {}));

答案 1 :(得分:0)

下面:

Observable<List<Item>> cachedObs = null;

public void Observable<List<Item>> getListStream(){
  if(cachedObs == null) {
    cachedObs = getStream().take(1).flatMap(item->getAll()).cache();
  }
  return cachedObs;
}

这将在getStream()的observable发出第一个项目之后调用getAll(),它会将结果缓存到所有订阅的同一个observable。