Эффективное (постоянное) обновление сообщений чата с помощью Firebase's Firestore - PullRequest
1 голос
/ 23 марта 2019

Я работаю над приложением React Native, которое использует Firebase's Firestore для бэкэнда.Прямо сейчас, каждый раз, когда приходит новое сообщение, я извлекаю все сообщения из 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()}
                        }
                    });
                }
            });
        });
}

Очевидно, что это очень плохо, потому что я 'Я использую много операций чтения только для одного нового сообщения, а также пользовательский опыт не очень хорош, поскольку существует постоянная задержка.Я также пытался сохранить адреса этих прослушивателей в реальном времени в состоянии избыточности и прослушивать метку времени последнего сообщения, но это тоже не казалось хорошим решением, так как я больше не принимал во внимание тот факт, что предыдущие сообщенияможет быть отредактировано.Что может быть хорошим способом обновления чатов в части React Native, чтобы я использовал как можно меньше операций чтения Firestore?

Заранее спасибо.

1 Ответ

3 голосов
/ 23 марта 2019

На мой взгляд, ваш код добавляет в запрос одного прослушивателя, который будет вызываться с результатами запроса каждый раз, когда эти результаты изменяются.

Похоже, вы думаете, что это перечитывает каждый документ каждый раз. Слушатели Firestore работают не так. Пока этот прослушиватель подключен, он будет считывать только изменения этого запроса, а не все результаты запроса. Любой документ из этого запроса, который не изменяется, не будет перечитан, даже если вы наблюдаете, что он повторно доставляется слушателю. Firebase SDK внутренне хранит все документы, кэшированные в памяти, до тех пор, пока этот прослушиватель подключен, и он будет считывать только минимальное количество документов, необходимых для синхронизации с сервером.

Другими словами, он уже использует минимальное количество операций чтения.

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