Начальная полезная нагрузка Firebase Firestore с onSnapshot

ПРИМЕЧАНИЕ. Этот подход работает только для Интернета, поскольку Firestore не предлагает кеширование для Интернета. В iOS и Android вы должны использовать другой подход для обработки начальной полезной нагрузки и последующих обновлений из-за кеширования. Первый ответ от подписки на iOS или Android будет из кеша. Второй ответ - это новые обновления от Firestore, а последующие ответы - только обновления / создание / уничтожение.

Я уже давно использую Firebase. Одна из проблем, с которыми я столкнулся с Firebase, - это странное поведение, когда вы хотите подписаться на запрос, он возвращает весь результат при первом вызове, а затем возвращает новые / обновленные документы.

Допустим, я хочу игнорировать начальную загрузку и слушать только новые изменения. Это просто подписка. Как узнать, какой звонок будет первым?

Firebase не предоставляет никаких способов проверить, является ли набор результатов первым. Я пробовал stackoverflow, чтобы узнать, не сталкивался ли кто-нибудь с такой же проблемой. Эта ветка многообещающая:

Похоже, что первый снимок запроса содержит только добавленное событие. Конечно, но что, если вы хотите также прослушивать новые события документа? Нужно ли обрабатывать первое added событие так же, как и последующие added события?

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

Что, если я могу подсчитать количество вызовов функции обратного вызова и полностью проигнорировать первый вызов? Вот общая оболочка функции, которая подсчитывает, сколько раз была вызвана обернутая функция.

createFnCounter() принимает 2 аргумента, первый - это оборачиваемая функция, а второй - количество вызовов, необходимых перед вызовом обернутой функции. Следовательно, createFnCounter(foo, 1) будет вызывать foo только при втором вызове. Я почти уверен, что некоторые имена в этой функции могут быть более явными, но вы поняли идею (если вы хотите обсудить, я не согласен).

Как вы используете эту функцию? У меня есть коллекция с именем activities, которая содержит все activities, произошедшие с моей коллекцией чата channels. Когда пользователь отправляет сообщение другому пользователю, создается / изменяется новое действие, чтобы уведомить клиент чата: «Эй, на этом канале появилось новое действие, делайте свое дело». Клиент получил событие и делает свое дело. Когда клиент инициализируется, я подписываюсь на activities коллекцию, как показано ниже.

Давайте добавим createFnCounter, чтобы получать только обновления и игнорировать начальную полезную нагрузку.

Я знаю, что это слишком многословно, но через полгода, когда я посмотрю на этот код, я пойму, что произошло.

Что, если я хочу получить и эту начальную полезную нагрузку, но сделать с ней что-то другое? Ну вот и мы

Итак, теперь у вас есть способ различать начальную загрузку и последующие обновления при подписке на документы в Firestore. Есть другие методы? Дайте мне знать!

Спасибо за прочтение! ≈