Как читать документы как офлайн и писать как (онлайн и офлайн) в firestore? - PullRequest
0 голосов
/ 14 июня 2019

Недавно я создал простое приложение для чата с использованием 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;
    });
}

1 Ответ

1 голос
/ 16 июня 2019

Когда вы используете get() (без аргументов) для чтения документа, клиент Firestore всегда проверяет сервер, чтобы убедиться, что вы получаете самые последние данные.

У вас есть два варианта получения данных излокальный кеш:

  1. Используйте get({ source: "cache" }) ( docs ), который вернет документ из локального кеша.Если документ не существует в локальном кэше, возникнет ошибка.В этом случае вы все равно захотите проверить данные на сервере.

  2. Использовать прослушиватель onSnapshot().Когда вы подключаете этот прослушиватель, он немедленно перезванивает со значением из локального кэша, как это делает get({ source: "cache" }).Но он также проверяет на сервере, есть ли какое-либо обновление данных.Если это так, он извлекает обновленный документ, обновляет локальный кэш и снова вызывает ваш код с обновленным значением.

Обычно рекомендуется использовать onSnapshot(), если вы отображаете данные впользовательский интерфейс, так как это означает, что ваш пользовательский интерфейс реагирует на изменения данных.

Подробнее об этом см. Как включить автономную поддержку? в Знакомство с облакомFirestore видео серия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...