我正在开发一个使用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读取?
谢谢。
答案 0 :(得分:3)
我的看法是,您的代码在查询上添加了一个侦听器,每次结果更改时,查询的结果就会被调用。
听起来您好像在想这每次都会重新读取每个文档。那不是Firestore侦听器工作的方式。只要连接了该侦听器,它将仅读取对该查询的更改,而不读取查询的整个结果。该查询中任何不变的文档都不会重新读取,即使您观察到它已重新传递给侦听器也是如此。只要连接了侦听器,Firebase SDK就会在内部将所有文档缓存在内存中,并且它将仅读取与服务器保持同步所需的最少文档数。
换句话说,它已经使用了最少的读取次数。