可以支持优先加载缓存,并且同时缓存最新的网络数据
conghuahuadan opened this issue · comments
葱花滑蛋 commented
你好,作者,可以支持优先加载缓存,并且同时缓存当前最新的网络数据吗
喵叔catuncle commented
还没看RxCache,目前我的实现方式是用concat,但是concat会走再次onNext,所以把缓存数据和网络包装一下(定义一个类CachedFlag),做个标记,然后做filter。主要代码如下:
public static <T> ObservableTransformer<List<T>, CachedFlag<T>> markCacheFlag(final boolean isFromCache) {
return new ObservableTransformer<List<T>, CachedFlag<T>>() {
@Override
public ObservableSource<CachedFlag<T>> apply(Observable<List<T>> upstream) {
return upstream.map(new Function<List<T>, CachedFlag<T>>() {
@Override
public CachedFlag<T> apply(List<T> data) {
CachedFlag<T> flag = new CachedFlag<>();
flag.setFromCache(isFromCache);
flag.setData(data);
return flag;
}
});
}
};
}
public static <T> ObservableTransformer<CachedFlag<T>, List<T>> unMarkCacheFlag() {
return new ObservableTransformer<CachedFlag<T>, List<T>>() {
@Override
public ObservableSource<List<T>> apply(Observable<CachedFlag<T>> upstream) {
return upstream
.filter(new Predicate<CachedFlag<T>>() {
private boolean isSuccess;
@Override
public boolean test(CachedFlag<T> flagData) {
if (flagData.isFromCache() ) {
if (flagData.getData() != null && flagData.getData().size() > 0) {
isSuccess = true;
}
} else {
isSuccess = true;
}
return isSuccess;
}
})
.map(new Function<CachedFlag<T>, List<T>>() {
@Override
public List<T> apply(CachedFlag<T> flagData) {
return flagData.getData();
}
});
}
};
}