【发布时间】:2019-10-29 07:47:25
【问题描述】:
最近我使用 Cloud Firestore 和 React Native 创建了一个简单的聊天应用程序。他们的离线和在线同步是一个相当不错的功能。
但是加载(阅读文档)非常耗时。 虽然我为每个用户(10 个用户)分页了 10 个文档,但加载消息仍然很慢,在缓慢的互联网连接中,加载消息需要 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;
});
}
【问题讨论】:
-
"但是加载(阅读文档)会耗费大量时间。"这取决于你如何阅读它。
get()将始终尝试从服务器读取,但onSnapshot实际上会立即使用本地数据触发,然后才检查服务器是否有新数据。如果您显示minimal code that reproduces what you current do,会更容易为您提供帮助。 -
我可以使用 onSnapshot 读取多个文档,特别是读取和列出消息吗?
-
快照没有工作
-
onSnapshot可以在DocumentReference上调用(在这种情况下,它会给你一个DocumentSnapshot)和Query(在这种情况下它会给你一个QuerySnapshot,其中包含零个或多个DocumentSnapshots)。如果您无法完成这项工作,请分享minimal code that reproduces where you are stuck。没有它,就很难为您提供进一步的帮助。 -
嗨@FrankvanPuffelen,谢谢你的回复,你能看看有问题的例子吗,我已经编辑了我的问题。我的代码运行良好,它收到了 12 个用户的 10 条消息。但问题是它需要很长时间,即使在良好的互联网中也需要大约 7 秒,在糟糕的互联网中需要大约 12 秒。当我使用 firebase 调用
disableNetwrok()函数时,大约需要 3 秒,这仍然不是很好,但是,比没有disableNetork()函数要好
标签: javascript firebase react-native google-cloud-firestore