2016-02-01 8 views
2

Я использую RxJava и Realm DB для моего приложения. Когда я запрашиваю данные в Царстве и звоню Realm.asObservable(), RealmResult испускает 2 раза.Realm DB Realm.asObservable() дважды испускает результаты

public class JustTest extends Activity { 
    private static final String TAG = "TEST"; 
    private Realm realm; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     realm = Realm.getDefaultInstance(); 
     realm.where(Group.class).findAllAsync().asObservable() 
       .subscribe(new Action1<RealmResults<Group>>() { 
        @Override 
        public void call(RealmResults<Group> groups) { 
         XLog.d(TAG, "Realm launch group result, size " + groups.size()); 
        } 
       }); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     realm.close(); 
    } 
} 

Вход:

TEST: Realm emits group result, size 0 
TEST: Realm emits group result, size 1 
+0

'.asObservable(). Skip (1)' – Jack

ответ

5

То есть дизайн, так как Realm испускает объект шаблонного немедленно, если вы подписаться на него. Если вы заинтересованы только в первом результате «реальный» вы можете сделать что-то вроде этого:

realm.where(Foo.class).findAllAsync().asObservable() 
    .filter(obj::isLoaded) // isLoaded is true when query is completed 
    .first() // Only get the first result and then complete 
    .subscribe(...) 

Это не сразу видно из текущей документации, но мы находимся в процессе обновления JavaDoc объяснить это лучше : https://github.com/realm/realm-java/pull/2201

+0

Я не могу использовать 'first', потому что я использую это в своем RxBinding. В некоторых из моего кода все еще есть ошибки. – Xhin

+1

Я не могу использовать «первый», потому что я использую это в своем RxBinding. – Xhin

+0

Почему бы и нет? 'realm.where (Group.class) .findAllAsync(). asObservable(). filter (..). first(). subscribe (...)' должно быть вполне возможно? –

Смежные вопросы