我使用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来更新视图?
答案 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之间的差异。