使用Firebase的Firestore有效(连续)更新聊天消息

时间:2019-03-23 18:35:05

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

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

谢谢。

1 个答案:

答案 0 :(得分:3)

我的看法是,您的代码在查询上添加了一个侦听器,每次结果更改时,查询的结果就会被调用。

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

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