【问题标题】:Firebase real-time efficiency question: How to set up listeners for a chat appFirebase 实时效率问题:如何为聊天应用设置监听器
【发布时间】:2020-06-13 21:52:20
【问题描述】:

我有一个使用 Firebase 作为实时数据库和 React Native 的聊天应用。在最小化读取操作和传输数据方面,我试图找出最有效的方法来设置来自 Firebase 的聊天消息的侦听器。这是我的数据结构:

- messages
  - chatId
    - messageId
      - sentBy
      - timestamp
      - text

在我看来,我有 2 个选项,ref.on("child_added)ref.on("value")

如果我使用ref.on("child_added"),好处是发送新消息时只会检索最新消息。但问题是,当加载对话时,会为聊天中的每条消息调用read 操作。如果一个对话有数百条消息,那么这就是数百个read 操作。

另一个选项是使用ref.on("value")。这里的问题是,在添加的每条新消息上,都会重新发送整个对话,而不仅仅是最近的消息。好处是在加载会话时,只需调用一次read操作,即可将整个会话转移到屏幕上。

我想要这两者的某种组合,其中当加载对话时,有一个 read 操作会带来对话的全部内容,并且当添加新的子节点时(一条新消息)只有该消息被传输到监听器。我怎样才能做到这一点?

【问题讨论】:

    标签: javascript firebase react-native firebase-realtime-database


    【解决方案1】:

    firebaser 在这里

    value 侦听器和 child_ 侦听器在同一位置/查询上的有线流量没有区别。如果您检查浏览器的“网络”选项卡,您可以准确查看检索到的发送内容,并且您会发现侦听器类型之间的内容完全相同。

    valuechild_* 事件之间的区别纯粹是在客户端进行的,以便您更轻松地更新 UI。事实上,即使您将 valuechild_* 侦听器都附加到同一个查询/位置,Firebase 也只会检索一次数据。

    执行所需操作的常用方法是将child_*value 侦听器附加到查询/位置。由于value 侦听器保证最后被触发,因此您可以使用该事实来检测初始加载何时完成。

    类似:

    var chatRef = firebase.database().ref("messages/chatId");
    var initialLoadDone = false;
    chatRef.on("child_added", (snapshot) => {
      if (initialLoadDone) {
        ...
      }
    });
    chatRef.once("value", (snapshot) => {
      snapshot.forEach((messageSnapshot) => {
        ...
      });
      initialLoadDone = true;
    });
    

    【讨论】:

      【解决方案2】:

      建议:使用 Firestore。它会维护您的数据缓存并有效地处理此类情况。


      您可以使用ref.once('value')仅获取一次当前节点,然后使用ref.on('child_added') 进行后续添加。 More performance notes.

      编辑:我相信 Firebase 数据库只需 ref.on('value') 就能有效地处理这个问题。在将新节点添加到我的数据库后检查网络选项卡时,我通知传输的数据量非常低。这可能意味着默认情况下,firebase 会缓存您以前的数据。建议您查看您的网络选项卡并做出此类决定,或者等待他们团队中的某个人显示指示。

      【讨论】:

      • 问题是当ref.on("child_added") 被调用时,它首先一次抓取所有当前子节点(可能是一百次读取),然后才抓取后续添加。有没有办法阻止第一个动作?
      • 使用 where 子句作为cursorTimestamp 上方的时间戳。这个cursorTimestamp 是您的value 查询运行的时间。
      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多