2016-06-11 5 views
1

영역에서 객체를 읽고 해당 객체를 찾을 수없는 경우 빈 관찰 가능 객체를 내보내는 함수를 만들려고합니다.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

+0

예. 자동 업데이트가 계속 작동하지만 take (1)을 사용하면 이벤트가 체인을 따라 전파되는 것을 막을 수 있습니다. –

+0

'findAllAsync()'를 사용하고'map()'을 사용하여'if (count> 0) {return results.get (0); } else {return null; }'하지만 Rx에 어떻게 쓰는지 모르겠다. 그래서 이것은 주석이다. – EpicPandaForce

답변

0

저는 제가 보는 문제를 강조 샘플 프로젝트를 만들었습니다. 그냥 flatMap 이상과 filter 아래 take(1)를 이동하는 경우는 제대로 작동합니다 :

realm.where(Dog.class) 
      .equalTo("id", 0L) 
      .findFirstAsync() 
      .asObservable() 
      .cast(Dog.class) 
      .filter(new Func1<RealmObject, Boolean>() { 
       @Override 
       public Boolean call(RealmObject realmObject) { 
        return realmObject.isLoaded(); 
       } 
      }) 
      .take(1) // <== here 
      .flatMap(new Func1<Dog, Observable<Dog>>() { 
       @Override 
       public Observable<Dog> call(Dog realmObject) { 
        if (realmObject.isValid()) { 
         return Observable.just(realmObject); 
        } else { 
         return Observable.empty(); 
        } 
       } 
      }) 
      .map(new Func1<Dog, Dog>() { 
       @Override 
       public Dog call(Dog dog) { 
        dog.setName("mapped " + dog.getName()); 
        return dog; 
       } 
      }) 
      .switchIfEmpty(Observable.just(createDefaultDog())) 
      .subscribe(new Action1<Dog>() { 
       @Override 
       public void call(Dog dog) { 
        textView.setText(dog.getName()); 
       } 
      }, new Action1<Throwable>() { 
       @Override 
       public void call(Throwable throwable) { 
        textView.setText(throwable.toString()); 

       } 
      }); 

내 추측 전에, flatMap가 반복적으로 호출 된 것입니다, Observable.empty() 여러 번 돌려. 아마 그것은 예상치 못한 방식으로 Observable chain에 영향을 줄 것입니다.

+0

나는이 샘플이 작동한다는 것에 동의한다. 나는 실제로 모든 것을 확실히하기 위해 그림에서 영역을 꺼내려고 노력했다. – donaldlittlpie

+0

나는 https://github.com/donaldlittlepie/realm-async-issue를보고있는 문제점을 강조한 샘플 프로젝트를 만들었습니다. 'MainActivity.java'에는 필자의 영역 결과를 기반으로 업데이트해야하는 두 개의 텍스트 뷰가 있습니다. 'findEmptyInRealm' 메소드는 결코 구독에 도착하지 않습니다. – donaldlittlpie

+0

프로젝트에 감사드립니다. 내 결과를 내 대답을 업데이 트 –

관련 문제