最近,我使用Cloud Firestore和React Native创建了一个简单的聊天应用程序。他们的离线和在线同步是一个很好的功能。
但是在加载(读取文档)时会花费大量时间。 尽管我为每个用户(10个用户)分派了10个文档,但是加载消息仍然很慢,但是在缓慢的Internet连接中,加载消息最多需要10秒钟,这不是一个很好的体验。
在这里,当我启用离线模式时,它加载消息的速度更快(将近3秒)。但这是一个问题:
现在:
可以将消息离线加载,也可以将消息保存(离线和在线)。
还是有其他更好的方法来更快地加载?
当我在Firebase中启用脱机功能时,它无法将消息保存在服务器中,或者在保存消息时禁用了脱机功能,当我加载消息时,它仅加载脱机消息。
示例:
async function getMessagesOfAllUser(userlist){
let outstate = false, data = {};
if (userlist !== null)
for (let i = userlist.length - 1; i >= 0; i--) {
outstate = await this.getMessagesOfOneUsers(userlist[i].user);
if (outstate !== false) data = { ...data, ...outstate };
if (i === 0) {
this.setState({ ...this.state, ...data });
}
}
}
function getMessagesOfOneUser(user) {
return db.collection('users/'+user/+'/messages').orderBy("dt", "desc").limit(10).get().then(snap => {
let l = snap.size;
if (l > 0) {
const ourMessage = this.state.me + user;
this.lastVisible = { ...this.lastVisible, ...{ [user]: snap.docs[l - 1] } };
for (let i = 0; i < l; i++) {
if (this.outState[ourMessage] !== undefined)
this.outState[ourMessage] = [...this.outState[ourMessage], snap.docs[i].data()];
else this.outState[ourMessage] = [snap.docs[i].data()];
if (i === l - 1) return this.outState;
}
}
return false;
});
}
答案 0 :(得分:1)
当您使用get()
(不带参数)读取文档时,Firestore客户端将始终与服务器核对以确保您获取最新数据。
您有两种选择可从本地缓存中获取数据:
使用get({ source: "cache" })
(docs),它将从本地缓存中返回文档。如果文档在本地缓存中不存在,则会引发错误。在这种情况下,您仍然需要检查服务器。
使用onSnapshot()
侦听器。附加此侦听器后,它会立即像从get({ source: "cache" })
一样使用本地缓存中的值进行回调。但是它还会与服务器一起检查数据是否有任何更新。如果存在,它将检索更新的文档,更新本地缓存,然后使用更新的值再次调用您的代码。
如果您在用户界面中显示数据,通常建议使用onSnapshot()
,因为这意味着您的UI对数据的更改有反应。
有关更多信息,请参见How do I Enable Offline Support?视频系列中的Getting to know Cloud Firestore。