2016-06-02 8 views
0

Warum führt dieser Code endlos .subscribe (..) aus? Ich nahm an, dass das Ereignis nur einmal ausgelöst wird, wenn das passende Content-Objekt gefunden wird. Aber es fängt immer wieder an.RxJava Realm findFirstAsync() Ergebnis wird nicht geladen, findFirst() feuert endlos

realm.where(Content.class) 
       .equalTo("keyID", id) 
       .findFirst() 
       .<Content>asObservable() 
       .map(this::getPostFromContent) 
       .subscribe(post -> { 
        loadComments(post.getId()); 
       }); 

Und wenn ich zu .findFirstAsync ändern() wirft eine Ausnahme: „kann keine Zeile zugreifen, die nicht geladen ist, stellen Sie sicher, dass die Instanz durch den Aufruf RealmObject.isLoaded geladen wird()“

Ich benutze die neueste Version von Realm.

UPDATE

konnte ich diese Arbeit machen, indem Sie:

realm.where(RealmWrappedContent.class) 
       .equalTo("keyID", id) 
       .findFirstAsync() 
       .<RealmWrappedContent>asObservable() 
       .filter(post -> post.isLoaded()) 
       .first() 
       .map(this::getPostFromContent) 
       .subscribe(post -> { 
        loadComments(post.getId()); 
       }); 

Aber das ist viel zu viele, was man nur schreiben müssen Reich Objekte als Observablen zu verwenden. Gibt es einen besseren Weg?

+0

Ich nehme an, dass Sie im ersten Fall jedesmal ein Ereignis erhalten, wenn sich das darunterliegende Realm ändert, lesen Sie dazu die [Dokumente zur Verwendung von 'asObservable()'] (https://realm.io/docs/java/latest /api/io/realm/RealmResults.html#asObservable--) – EpicPandaForce

Antwort

1

Das Standardverhalten wird jedes Mal übermittelt, wenn ein Update durchgeführt wird. In diesem Fall müssen Sie filter/first verwenden, um nur 1 Element zu erhalten, wie Sie herausgefunden haben. Wenn Sie dieses Verhalten in Ihrer gesamten App ändern möchten, können Sie auch Ihre eigene RxObservableFactory Implementierung wie hier beschrieben bereitstellen: https://realm.io/docs/java/latest/#rxjava.

Die Standard-Factory heißt RealmObservableFactory und es sollte ziemlich einfach sein, entweder wickeln, oder bieten Sie Ihre eigene Implementierung, die das tut, was Sie für alle Observables wollen.