2016-06-04 9 views
2

Ich bin mit meiner Feuerbasis um Daten zu speichern und es strukturiert ist, auf diese Weise:RxJava mit Firebase Kind Ereignisse entfernen

users { 
    userid {information here} 
} 
friends { 
    userid { 
     friendid1:true 
     friendid2:true 
    } 
} 

Wenn ein friendID hinzugefügt oder entfernt wird, dann wird ein entsprechendes Ereignis aufgerufen werden soll. Wenn die Benutzerinformationen geändert werden, sollte eine Ereignisaktualisierung ausgelöst werden.

Bisher habe ich:

RxFirebaseDatabase.observeFriendList(/*Path to friends id list*/) 
       .flatMap(new Func1<RxFirebaseChildEvent, Observable<User>>() { 
        @Override 
        public Observable<User> call(RxFirebaseChildEvent stringBooleanPair) { 
         //This is a childeventlistener callback 
         //The key of RxFirebaseChildEvent is the friendid 
         switch (stringBooleanPair.getEventType()) { 
          case ADDED: 
           return RxFirebaseDatabase.observeUserInformation(/*path to user list*/.child(stringBooleanPair.getKey()), User.class); 
          case REMOVED: 
           return null; //What do I do here to unregister the listener? 
         } 
        } 
       }).subscribe(user -> { 
        //This is a ValueEventListener callback that returns the user 
        //Add, remove or update here, how? 
     }); 

Wie entferne ich den spezifischen Benutzer Zuhörer, wenn ein friendID entfernt und rufen auch hinzufügen/entfernen/Update auf diesen Benutzer die Ansicht zu aktualisieren?

+0

Sie müssen diese 'RxFirebase' Bibliothek nicht schon entfernen, wenn Sie Ihr' Observable' abbestellen –

Antwort

0

Ich kam mit einer etwas gehackten Version, würde gerne eine bessere Implementierung sehen, obwohl.

//refUsers is path to users 

List<String> userKeys = new ArrayList<>(); 
RxFirebaseDatabase.observeFriendList(/*Path to friends id list*/) 
       .flatMap(new Func1<RxFirebaseChildEvent, Observable<User>>() { 
        @Override 
        public Observable<User> call(RxFirebaseChildEvent stringBooleanPair) { 
         //This is a childeventlistener callback 
         //The key of RxFirebaseChildEvent is the friendid 
         switch (stringBooleanPair.getEventType()) { 
          case ADDED: 
           userKeys.add(stringBooleanPair.getKey());//User Key 
           return RxFirebaseDatabase 
             .observeUserInformation(refUsers.child(stringBooleanPair.getKey()), 
                   User.class, 
                   Eventype.ADDED) 
             .takeWhile((user) -> userKeys.contains(user.getKey())); 
          case REMOVED: 
           userKeys.remove(userid); 
           return RxFirebaseDatabase 
             .observeUserInformation(refUsers.child(userid), 
                   User.class, 
                   Const.EventType.REMOVED) 
             .take(1); 
         } 
        } 
       }).subscribe(userEvent -> { 
        //Returns an object that contains the user and the eventype (added, updated or removed) 
     }); 

Grundsätzlich bin ich die Verfolgung der Nutzer, die in der Freundesliste befinden und nur ein Ereignis zurückkehrt, wenn die Benutzer-ID noch beobachtet wird.

0

Sie brauchen nicht zu tun, dass RxFirebase Bibliothek bereits Ihre Zuhörer entfernen, wenn Sie Ihre beobachtbare abmelden, können Sie es sehen, wenn Sie die Umsetzung überprüfen:

subscriber.add(Subscriptions.create(new Action0() { 
    @Override 
    public void call() { 
    query.removeEventListener(childEventListener); 
} 

Ich schlage vor, Sie als Referenz zu überprüfen (oder verwenden Sie es nur) meine RxJava2 Bibliothek, wenn Sie Ihre Anwendung von RxJava zu RxJava2 aktualisieren möchten:

https://github.com/FrangSierra/Rx2Firebase

wenn Sie Interesse daran sind, die Unterschiede zwischen den beiden RxJava here sehen können.

Verwandte Themen