【问题标题】:Updating chat messages efficiently (continuously) with Firebase's Firestore使用 Firebase Firestore 高效(持续)更新聊天消息
【发布时间】:2019-08-14 11:21:24
【问题描述】:

我正在开发一个使用 Firebase 的 Firestore 作为后端的 React Native 应用程序。现在,每次收到新消息时,我都会从 Firestore 中获取所有消息并更新我的状态,尽管它只是收到了一条新消息。

function listenCurrentChat(dispatch, chatID) {
    const address = "chats/" + chatID + "/messages";
    firebase.firestore().collection(address).orderBy('createdAt')
        .onSnapshot(function (querySnapshot) {
            dispatch({
                type: CLEAR_MESSAGES,
                payload: {
                    chatID: chatID,
                }
            });
            querySnapshot.forEach(function (doc) {
                //local
                if (doc.metadata.hasPendingWrites) {
                    dispatch({
                        type: ADD_MESSAGE,
                        payload: {
                            chatID: chatID,
                            message: {...doc.data(), createdAt: new Date()}
                        }
                    });
                } else {
                    dispatch({
                        type: ADD_MESSAGE,
                        payload: {
                            chatID: chatID,
                            message: {...doc.data(), createdAt: doc.data().createdAt.toDate()}
                        }
                    });
                }
            });
        });
}

显然这很糟糕,因为我只为一条新消息使用了多次阅读,而且用户体验一点也不好,因为总是有延迟。我还尝试将这些实时侦听器的地址保存在 redux 状态,并从最后一条消息的时间戳进行侦听,但这似乎也不是一个好的解决方案,因为我不再考虑以前的消息可以编辑。什么是更新 React Native 部分的聊天对话的好方法,以便我使用尽可能少的 Firestore 读取?

提前致谢。

【问题讨论】:

    标签: javascript firebase react-native google-cloud-firestore


    【解决方案1】:

    在我看来,您的代码在查询中添加了一个侦听器,每次查询结果发生变化时都会调用该侦听器。

    听起来您认为这每次都会重新读取每个文档。这不是 Firestore 监听器的工作方式。只要附加了该侦听器,它就只会读取对该查询的更改,而不是查询的整个结果。该查询中的任何未更改的文档都不会被重新读取,即使您观察到它被重新交付给侦听器。只要附加了该侦听器,Firebase SDK 就会在内部将所有文档缓存在内存中,并且它只会读取与服务器保持同步所需的最少数量的文档。

    换句话说,它已经使用了最少的读取次数。

    【讨论】:

    • 问题在于,每次添加新元素时,侦听器都会返回所有元素,如果新消息是新消息还是已经存在,继续检查任何新消息效率不高。
    • 如果您只想知道自上次调用侦听器以来发生了什么变化,您可以使用querySnapshot.docChanges() 仅查看添加、更改和删除的文档。处理这些数据不会产生任何额外的读取 - 所有数据都已经是本地的。另请参阅the documentation for this
    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多