使用 Firebase 的 Firestore 高效(持续)更新聊天消息

2024-04-22

我正在开发一个使用 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 读取?

提前致谢。


在我看来,您的代码在查询上添加一个侦听器,每次结果更改时都会使用查询结果调用该侦听器。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Firebase 的 Firestore 高效(持续)更新聊天消息 的相关文章

随机推荐