Convert Maybe to Single de otra fuente si Maybe completa

Me gustaría crear una class Repository que devuelva un Single<Something> .

La class debería primero search en un Cache que devuelva Maybe<Something> y si el Maybe complete se va a mi Service que devuelve Single<Something>

 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 } } 

He buscado a través de JavaDoc, pero no parece que exista un transformador para este escenario.

¿Hay una buena manera de manejar esto?

Aquí hay dos opciones bastante simples que podrías usar. El primero que encuentro más explícito. El segundo tiene el beneficio de que llamarás a la networking por cualquier error en el caching.

Suponen que Maybe se devuelve desde el caching. Por ejemplo, si no se encuentra ningún valor en la memory caching, devuelva Maybe.empty ()

1) Si hay un vacío en la secuencia, switchIfEmpty () usará el observable alternativo que llama a la networking. Si no hay vacío en la transmisión, nunca se llamará a la networking.

 override fun getSomething(): Single<Something> { return cache.getSomething() .switchIfEmpty( Maybe.defer { feed.getSomething().toMaybe() } ) .toSingle() } 

2) Un vacío tal vez devolverá un error cuando se envía a Singular (), lo que activará la llamada de networking.

 override fun getSomething(): Single<Something> { return cache.getSomething() .toSingle() .onErrorResumeNext { feed.getSomething() } } 

Cuando necesite realizar operaciones de RxJava utilizando metadatos (ausencia de resultados en caching), es posible que tenga que transformar su cadena de observadores en una secuencia de metadatos, utilizando materialize() .

(Disculpas por mi falta de fluidez en Kotlin)

 fun getSomething(): Single<Something> { return cache.getSomething() .toObservable() .materialize() .take(1) .flatMap( it.hasValue() ? Single.just( it.getValue() ) : Single.fromCallable( apiCall() ) ); } 

El operador materialize() convierte el flujo del observador en una secuencia de Notification s. Luego puede inspeccionar la primera notificación, y si tiene un valor, úselo. De lo contrario, haga su llamada de networking.

  • Cómo hacer que la function regrese Observable
  • Sitio de Android con RxJava manejar resultado de consulta vacío
  • Single.zip completando antes de Success
  • consultas de múltiples dominios de Android con RXJava
  • HttpException no capturado por onError ()
  • ¿Cómo especificar la versión de RxJava al usar RxKotlin?
  • Asunto de RxJava: escuche el tipo diferente que el que emite
  • No se puede 'observar en' hilo principal con RxKotlin
  • Aplicando transformación a cada elemento en Single <List <T >>
  • Rx-Kotlin awaitTerminalEvent nunca se sube a Completo
  • Llamar a un RxJava Single In Kotlin Lambda