我有一个不完整的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是一个完整的观察者。
的SingleItemContentProviderStore.java这种方法的问题是:
getStream()返回一个发出upserted项的observable,因此每次列表发生更改时都会调用getAll
方法。这意味着向列表中添加100个项目,触发getListStream()可观察100次。我明白这种方法是错误的,有没有更好的方法?
答案 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。