如何在Firestore中将文档离线阅读和(在线和离线)写作?

时间:2019-06-14 16:32:48

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

最近,我使用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;
    });
}

1 个答案:

答案 0 :(得分:1)

当您使用get()(不带参数)读取文档时,Firestore客户端将始终与服务器核对以确保您获取最新数据。

您有两种选择可从本地缓存中获取数据:

  1. 使用get({ source: "cache" })docs),它将从本地缓存中返回文档。如果文档在本地缓存中不存在,则会引发错误。在这种情况下,您仍然需要检查服务器。

  2. 使用onSnapshot()侦听器。附加此侦听器后,它会立即像从get({ source: "cache" })一样使用本地缓存中的值进行回调。但是它还会与服务器一起检查数据是否有任何更新。如果存在,它将检索更新的文档,更新本地缓存,然后使用更新的值再次调用您的代码。

如果您在用户界面中显示数据,通常建议使用onSnapshot(),因为这意味着您的UI对数据的更改有反应。

有关更多信息,请参见How do I Enable Offline Support?视频系列中的Getting to know Cloud Firestore