带Firebase的RxJava删除子事件

时间:2016-06-04 14:46:32

标签: firebase rx-java

我使用firebase存储我的数据,结构如下:

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

如果添加或删除了friendid,则应调用适当的事件。 如果更改了用户信息,则应触发事件更新。

到目前为止,我有:

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?
        });

如何删除friendId时删除特定的用户侦听器,并在该用户上调用add / remove / update来更新视图?

2 个答案:

答案 0 :(得分:0)

我想出了一个有点黑客攻击的版本,很想看到更好的实现。

//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)
        });

基本上,我正在跟踪朋友列表中的用户,并且仅在仍然观看用户ID时才返回事件。

答案 1 :(得分:0)

当您取消订阅Observable时,您不需要这样做RxFirebase库已经删除了您的监听器,如果您检查实现,可以看到它:

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

如果您想将应用程序从RxJava更新为RxJava2,我建议您检查我的RxJava2库作为参考(或只是使用它):

https://github.com/FrangSierra/Rx2Firebase

如果您对此感兴趣,可以看到两个RxJava here之间的差异。