gpt4 book ai didi

firebase - 使用 RxJava 连接来自 Firebase 实时数据库的扁平化数据

转载 作者:行者123 更新时间:2023-12-04 21:09:12 25 4
gpt4 key购买 nike

连接扁平数据是一个常见的用例,也在 documentation 中进行了描述。 .但是文档显示了一个简单的示例,它不是实时的,它不会对更改使用react。我正在寻找更强大的实现。我认为 RxJava 非常适合这一点。

考虑以下 Firebase 结构:

{
"messages": {
"group_id_1": {
"message_id_1": {
"text": "Hello",
"author": "uid_1"
}
}
},
"users": {
"uid_1": {
"name": "David"
}
},
"rooms": {
"room_id_1": {
"name": "General",
"members": {
"uid_1": true
}
}
}
}

我在这里看到两个用例:
  • 获取具有作者姓名的组中的消息列表
  • 我想我会得到 Observable<Message>当我订阅它时,依赖项(这些消息的用户)也将在某些缓存中被订阅。当我显示消息时,我可以从缓存中获取作者的姓名。
  • 它也是实时的——如果作者姓名发生变化,则可观察对象会发出更改的消息。
  • 当我取消订阅 observable 时,依赖项也会取消订阅。
  • 获取带有姓名的房间成员列表
  • 我想我会得到 Observable<User>当我订阅它时,它会先订阅房间的成员,然后再订阅个人用户。
  • 这是实时的——如果房间成员发生变化,我会收到通知。
  • 当我取消订阅 observable 时,依赖项也会取消订阅。

  • 您知道可以做到这一点的库/解决方案吗?

    或者如果我创建了一个,你会使用它吗?

    最佳答案

    我打算提出这个问题的一个变体,但似乎在这个问题之上构建可能会更好......我将描述希望至少部分回答上述问题的内容,但也是我的一个缺点看到。

    使用上面的数据模型,我们可能有类似以下的东西来围绕firebase查询创建RxJava包装器,以获取特定房间的成员键列表并获取特定成员的详细信息(注意在onCompleted()中使用subscriber.getMemberInfo ...更多内容之后!)。

    public Observable<String> getRoomMembers(String roomId) {
    return Observable.create(subscriber -> {
    databaseReference.child(roomId + "/members").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
    String userId = childSnapshot.getKey()
    subscriber.onNext(userId);
    }
    subscriber.onCompleted();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
    });
    });
    }

    public Observable<Member> getMemberInfo(String memberId) {
    return Observable.create(subscriber -> {
    databaseReference.child(memberId).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
    Member member = dataSnapshot.getValue(Member.class);
    subscriber.onNext(member);
    subscriber.onCompleted();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
    });
    });
    }

    然后我们可以使用以下内容获取 Member 的列表s 用于特定房间(已将 isActive 属性添加到 Member 以显示我们如何过滤获得的结果)。
        getRoomMembers(roomId)
    .flatMap(memberId -> getMemberInfo(memberId))
    .filter(Member::isActive)
    .toList()
    .subscribe(members -> {

    });

    因此,上述内容在一定程度上起作用。问题是我不得不调用 subscriber.onCompleted()getMemberInfo上述电话至 flatMap工作....这意味着对 Member 的任何后续更改数据未触发上述订阅中的更新。我对 RxJava 比较陌生和 Firebase所以可能会遗漏一些明显的东西。

    关于firebase - 使用 RxJava 连接来自 Firebase 实时数据库的扁平化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38143117/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com