好的,所以我正在开发一个项目,我需要从服务器获取Json,获取相应的POJO,填写一些视图并结束。
我面临的问题是,我必须嵌套网络呼叫以获取我需要的最终数据。并且为了最小化网络调用,我必须重用它们,这导致非常复杂的RxOperator链。例如:
getCarId() // network call
.flatMap(carIdObj -> getCarModelById(carIdObj)
.doOnNext(... update car views)
.flatMap(carModelObj -> { return carIdObj;}
.flatMap(carIdObj --> getTruckModelById(carIdObj)
.doOnNext(... update truck views)
.flatMamp(truckModelObj -> { return carIdObj; }
解释运营商链(这是一个例子)
因此,网络call1和网络调用3是相同的,所以我应该重用它们,这意味着,我应该只调用一次并保存数据。这就是为什么Rx-Operator链接在上面。
我的问题是,有没有办法实现相同的目标,但通过缓存网络call1而不是这个可怕的不可读的运营商链?
我不明白缓存是如何工作的,如何将此运算符应用于此场景?
答案 0 :(得分:3)
cache正是您所需要的,以下是您使用它的方式:
cachedCarIds = getCarIds().cache();
cachedCarIds.map(this::getCarModelById).subscribe(... update car views);
cachedCarIds.map(this::getTruckModelById).subscribe(... update truck views);
cache()
将确保订阅ID仅执行一次(首次订阅时),并保存所有值以供将来订阅者使用。