영역에서 객체를 읽고 해당 객체를 찾을 수없는 경우 빈 관찰 가능 객체를 내보내는 함수를 만들려고합니다.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
이상한 것은 내가 원래 방법을 업데이트하는 경우 포함하는 것을하는 first()
이전 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()
}
}
모든 시작 예상대로 작동하지만이 버전 때문에 자동 업데이트를 죽일 생각 그것은 필터 뒤에 나오는 첫 번째 결과 만 캡처합니다.
나는 여전히 멍청한 짓을하고있는 중이다.
편집 : - 나는 완전히 이해하지 못하는 이유 https://github.com/donaldlittlepie/realm-async-issue
예. 자동 업데이트가 계속 작동하지만 take (1)을 사용하면 이벤트가 체인을 따라 전파되는 것을 막을 수 있습니다. –
'findAllAsync()'를 사용하고'map()'을 사용하여'if (count> 0) {return results.get (0); } else {return null; }'하지만 Rx에 어떻게 쓰는지 모르겠다. 그래서 이것은 주석이다. – EpicPandaForce