web-dev-qa-db-ja.com

多分完了したら、多分別のソースから多分シングルに変換する

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を検索しましたが、このシナリオのトランスフォーマーが存在しないようです。

これを処理する良い方法はありますか?

10
Altoyyr

使用できる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()
        }
  }
7
enyciaa

メタデータを使用して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()演算子は、オブザーバーストリームをNotificationsのストリームに変換します。次に、最初の通知を調べて、値がある場合はそれを使用します。それ以外の場合は、ネットワークに電話をかけます。

1
Bob Dalgleish