Usando RxJava para get un resultado distinto con Realm y Retrofit

Sé que Dan Lew prácticamente respondió la cuestión de get datos de diferentes fonts con un

.concat(/*...*/) .take(1)

Pero, ¿qué sucede si en lugar de get una Lista de usuarios de mis datos almacenados localmente y de la actualización?

Necesitaba hacer una operación específica de database en los datos antes de mostrar el resultado, como mostrar solo usuarios distintos. En ese caso, simplemente usar el operador concat en mi petición de networking y en los datos locales no devolvería el mismo resultado.

¿Hay alguna forma idiomática de escribir esto con RxJava?

¿Has probado distinct() ? Según la documentation , este método le dará solo un object diferente cuando se emitan. Si tiene objects personalizados, creo que debe implementar equals() y hashCode()

Lo que terminó funcionando realmente bien para mí es hacer que la request de networking devuelva un RealmResult y save los datos justo antes de llamar a RealmQuery, por lo que es algo así como:

 fun network(): Observable<RealmResult<Something>> { return getAuth() .andThen(somethingRepository.getRemoteSomething()) .doOnNext { somethings: List<Something> -> somethingRepository.saveSomethings(somethings) } .flatMap { distinctSomethings } } val distinctSomethings: Observable<RealmResults<Something>> by lazy { getDistinctSomethings() } //... later fun showDistinctSomethings() { Observable.concat( distinctSomethings, network() ) .filter { somethings: RealmResults<Something> -> somethings.toArray().isNotEmpty() } .take(1) .subscribe(/*..show distinct somethings here.*/) } 

Sin embargo, es crucial que puedas replace getDistinctSomethings() con cualquier búsqueda compleja de Realm y siempre obtendrás el resultado correcto

Espero que esto ayude a alguien a mi lado: P