Ich versuche, eine Funktion zu erstellen, die ein Objekt aus dem Realm liest und eine leere Observable ausgibt, wenn das Objekt nicht gefunden wird. Der Code funktioniert unten bis zu einem gewissen Grad, weil ich es mit dem Debugger stoppen und sehen, es ist genau die Observable.empty()
:Realm.firstFirstAsync(). AsObservable() arbeitet nicht konsistent mit RxJava.switchIfEmpty
fun readFromRealm(id: String): Observable<Player> {
return realm.where(Player::class.java)
.equalTo("id", id)
.findFirstAsync()
.asObservable<Player>()
.filter { it.isLoaded }
.flatMap {
if (it.isValid)
Observable.just(it)
else
Observable.empty()
}
}
Aber wenn ich versuche, der Code ein switchIfEmpty
auf den beobachtbaren verwenden emittiert nie defaultPlayer
, wenn sie nicht gefunden wird im Reich.
return readFromRealm(playerId)
.take(1)
.map{ // do something with emitted observable }
.switchIfEmpty(Observable.just(defaultPlayer)) // use this if no player found
Das Merkwürdige ist, dass, wenn ich die ursprüngliche Methode aktualisieren, um umfassen ein first()
vor dem flatMap
:
fun readFromRealm(id: String): Observable<Player> {
return realm.where(Player::class.java)
.equalTo("id", id)
.findFirstAsync()
.asObservable<Player>()
.filter { it.isLoaded }
.first() // add first
.flatMap {
if (it.isValid)
Observable.just(it)
else
Observable.empty()
}
}
Alles beginnt wie erwartet, aber ich glaube, diese Version Auto Update töten, weil Es erfasst nur das erste Ergebnis, das nach dem Filter ausgegeben wird.
Ich versuche immer noch, Realm und Rx zu finden, also mache ich wahrscheinlich etwas Dummes.
EDIT: Ich habe ein Beispielprojekt erstellt, die das Problem verdeutlicht ich sehe - https://github.com/donaldlittlepie/realm-async-issue
Ja. Die automatische Aktualisierung funktioniert weiterhin, aber Ihr Take (1) führt dazu, dass sich das Ereignis nicht weiter in der Kette fortpflanzt. –
Probieren Sie 'findAllAsync()' aus und verwenden Sie 'map()', um 'if (count> 0) {return results.get (0); } else {null zurückgeben; } 'aber ich weiß nicht, wie man das in Rx schreibt, so ist dies ein Kommentar statt – EpicPandaForce