私は次のようなシナリオを持っています:Foo
というオブジェクトがあります。このFoo
オブジェクトはリモートサービスから来ており、このインスタンスをローカルにキャッシュしたいと思います。一定の時間が経過するまで使用してください。これまでのところ、私が来ている今RxJava:タイムスタンプが期限切れになるまでキャッシュから読み取る
public class FooState {
private Foo foo;
private long timestamp;
/* Constructor and getters */
}
、:これまでのところ、私はFoo
はミリ秒単位でフェッチされた時刻を示すタイムスタンプと一緒にFoo
のインスタンスが含まれているFooState
クラスを作成しようとしました
連結を使用しています。このコードで、最大:キャッシュされた値があるかどう
public Observable<Foo> foo() {
return Observable.concat(local(), remote())
.takeFirst(fooState -> fooState.getTimestamp() >= System.currentTimeMillis())
.map(fooState -> fooState.getFoo())
.defaultIfEmpty(new Foo());
}
private Observable<FooState> local() {
return Observable.just(cache.hasFooState() ? cache.getFooState() : new FooState(null, 0));
}
private Observable<FooState> remote() {
return api.getFoo()
.map(foo -> new FooState(foo, System.currentTimeMillis() + ONE_DAY_MILLIS)
.doOnNext(fooState -> {
cache.save(fooState);
});
}
は基本的に、私がいる限り、タイムスタンプの有効期限が切れていないとして、それを使用したいです。タイムスタンプが期限切れになっているか、キャッシュされた値がない場合は、リモートサービスからフェッチして結果をキャッシュします。
このユースケースを実装するクリーナーの方法はありますか?私はRxJavaにはまったく新しく、Rx-gurusがこのシナリオを処理するためのより良い方法を知っているかどうか疑問に思っていました。