我正在开发一个使用 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(使用前将#替换为@)