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.

  • Espere hasta que dos observables emitan verdadero
  • Tipo de devolución diferente en RxJava 2 (actualización desde RxJava1)
  • Inferencia de tipo Observable.combineLatest en kotlin
  • RxJava 1.x .zip () no funciona en RxJava 2.0
  • HttpException no capturado por onError ()
  • RxJava2 switchIfEmpty y verificando una ejecución
  • No se puede comprimir Rxjava Observables
  • Problema de encadenamiento Completable after flatMapCompletable
  • ¿Cuál es la diferencia entre llaves y soportes normales en RxJava con Kotlin?
  • Referencia de constructor de Kotlin con generics
  • Cómo escribir la testing adecuada para el repository de interfaz reactiva que devuelve Observable solo cuando hay algún evento, cómo simular el desencadenamiento de ese evento