レルムからオブジェクトを読み取り、オブジェクトが見つからない場合は空のオブザーバブルを発行する関数を作成しようとしています。Realm.firstFirstAsync()。asObservable()が一貫して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()
}
}
しかし、私が観察上でコードをswitchIfEmpty
を使用しようとすると、それが見つからない場合defaultPlayer
を発することはありません:以下のコードは、私は、デバッガでそれを停止し、それがObservable.empty()
を打つ見ることができるので、ある程度まで動作しますレルムで
return readFromRealm(playerId)
.take(1)
.map{ // do something with emitted observable }
.switchIfEmpty(Observable.just(defaultPlayer)) // use this if no player found
奇妙なことは、私が前flatMap
にfirst()
が含まれるように、元のメソッドを更新した場合ということです:
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()
}
}
すべてが期待通りに機能し始め、私は、このバージョンがあるため、自動更新を殺すだろうと考えていますフィルタの後に最初に出力された結果のみをキャプチャします。
私はまだRealmとRxをgrokしようとしているので、私はおそらく何かダムをやっているでしょう。
編集: - 私は完全に理解していない理由のためにhttps://github.com/donaldlittlepie/realm-async-issue
はい。自動更新は引き続き機能しますが、あなたのtake(1)はイベントがチェーンをさらに伝播するのを止めます。 –
'findAllAsync()'を使ってみて、 'map()'を使って 'if(count> 0){return results.get(0); } else {nullを返します。 } 'しかし、私はRxでそれを書く方法を知らないので、これはコメントです。 – EpicPandaForce