Single<Something>
を返すRepository
クラスを作成したいと思います。
クラスは最初にMaybe<Something>
を返すCache
を調べ、Maybe
が完了するとSingle<Something>
を返す私のService
に移動する必要があります。
interface Cache {
fun getSomething(): Maybe<Something>
}
interface Service {
fun getSomething(): Single<Something>
}
class Repository (
private val cache: Cache,
private val service: Service
) {
fun getSomething(): Single<Something> {
return cache.getSomething()
.????(feed.getSomething()) //onCompleteTransformToSingle() or similar
}
}
JavaDocを検索しましたが、このシナリオのトランスフォーマーが存在しないようです。
これを処理する良い方法はありますか?
使用できる2つの非常に単純なオプションを次に示します。最初に私はより明確に見つけます。 2つ目は、キャッシュ内のエラーが発生したときにネットワークを呼び出すという利点があります。
これらは、たぶんキャッシュから返されることを前提としています。たとえば、キャッシュに値が見つからない場合は、Maybe.empty()を返します。
1)ストリームに空がある場合、switchIfEmpty()はネットワークを呼び出す代替オブザーバブルを使用します。ストリームに空がない場合、ネットワークは呼び出されません。
override fun getSomething(): Single<Something> {
return cache.getSomething()
.switchIfEmpty(
Maybe.defer {
feed.getSomething().toMaybe()
}
)
.toSingle()
}
2)空の場合、toSingle()にキャストするとエラーが返され、ネットワーク呼び出しがトリガーされる可能性があります。
override fun getSomething(): Single<Something> {
return cache.getSomething()
.toSingle()
.onErrorResumeNext {
feed.getSomething()
}
}
メタデータを使用してRxJava操作を実行する必要がある場合(キャッシュされた結果がない場合)、materialize()
を使用してオブザーバーチェーンをメタデータストリームに変換する必要がある場合があります。
(Kotlinに堪能でないことをお詫びします)
_fun getSomething(): Single<Something> {
return cache.getSomething()
.toObservable()
.materialize()
.take(1)
.flatMap( it.hasValue() ? Single.just( it.getValue() )
: Single.fromCallable( apiCall() )
);
}
_
materialize()
演算子は、オブザーバーストリームをNotification
sのストリームに変換します。次に、最初の通知を調べて、値がある場合はそれを使用します。それ以外の場合は、ネットワークに電話をかけます。