Слушатель Firestore получает документы с DocumentChange.Type ADDED (игнорировать кэшированные данные) - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь добавить функцию чата в свое приложение, и я пытаюсь прослушать сообщения, которые другой пользователь отправляет после загрузки старых сообщений.

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

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

Итак, допустим, мы добавим ограничение в 50 (я объясню почему 50), таким образом, всякий раз, когдадругой пользователь отправляет новое сообщение, мы получаем 1 новое сообщение и 49 кэшированных сообщений, которые мы будем игнорировать.

Хорошо, все нормально работает, как это, но что, если мы переходим в автономный режим, а другой пользователь отправляет сообщения?Если другой пользователь отправляет 10 сообщений, пока мы не в сети, то мы возвращаемся в оперативный режим, слушатель будет активирован, и мы загрузим 10 новых сообщений плюс 40 кэшированных сообщений, а что, если пользователь отправил 55 сообщений, пока мы не в сети?хорошо, когда мы вернемся в онлайн, мы загрузим только 50 новых сообщений и не будем загружать оставшиеся 5 сообщений, это моя проблема.

Я могу просто снять ограничение, но тогда, если у пользователей есть тысячи кэшированных сообщенийМне придется проходить их каждый раз, когда отправляется новое сообщение, которое я считаю действительно неэффективным. Лучшее решение будет заключаться в том, чтобы получать только что добавленные сообщения только при срабатывании слушателя, ограничение в 50, которое я использую сейчас, составляет всего лишьпростой обходной путь, который не работает во всех состояниях.

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

что если пользователь отправил 55 сообщений, пока мы не в сети?хорошо, когда мы вернемся в онлайн, мы загрузим только 50 новых сообщений и не будем загружать оставшиеся 5 сообщений, это моя проблема.

Когда мы говорим о большом количестве сообщений, мы не толькоограничение запросов.Как вы уже заметили, если ограничение меньше количества сообщений, полученных в автономном режиме, вы будете загружать только то количество сообщений, которое соответствует вашему ограничению.В таких случаях мы используем нумерацию страниц .Поэтому в первом запросе лучше всего использовать ограничение (limit(50)), а в последующих запросах - последний видимый документ.Таким образом, когда пользователь прокручивает, он может теперь загрузить те 5 сообщений, которые он не мог видеть, если мы использовали только вызов limit(50).

Редактировать:

Вы все еще можете сделать это, если используете прослушиватель снимков.Проверьте это:

db.collection("yourColl").document("yourDoc").addSnapshotListener(new DocumentListenOptions().includeMetadataChanges(), new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(DocumentSnapshot snapshot, FirebaseFirestoreException e) {
        System.out.println("isFromCache: " + snapshot.getMetadata().isFromCache());
    }
});
0 голосов
/ 23 сентября 2019

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

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