Кэширование документов Firestore в Firebase IOS SDK

Вопрос или проблема

Я прочитал в документации, что Firebase SDK автоматически удаляет наименее используемые документы из кэша. У меня возникла проблема с прогнозированием того, что произойдет в следующей ситуации:

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

Я получаю эти избранные предметы, локально сохраняя идентификаторы документов избранных предметов в виде массива строк.
Затем я извлекаю их из кэша с помощью:

let subjectsIds = userDefaults.object(forKey: subjectsKey) as? [String]
let query = db.firestore.subjects.whereField(FieldPath.documentID(), in: subjectsIds)
    

Чтобы сэкономить трафик, документ предмета содержит поле last_updated типа Timestamp.
Сначала я загружаю все предметы из кэша, затем получаю наибольшее значение last_updated.
Затем я получаю обновленные документы с сервера с помощью:

let date = getGreatestLastUpdated()
let query = db.firestore.subjects.whereField("last_updated", isGreaterThan: date)

Меня беспокоит случай, когда пользователь долго не переходит на страницу все предметы, что приводит к удалению из кэша всех предметов, кроме избранных, так как они всегда загружаются. Это приведет к тому, что предметы, которые не были обновлены после избранных, не будут извлечены с сервера с помощью моего метода. Так ли работает удаление кэша в Firebase IOS SDK?

Ответ или решение

Кэширование документов Firestore в Firebase iOS SDK

Кэширование — ключевая функция Firestore, предназначенная для оптимизации работы с данными, позволяющая приложению работать даже в условиях ограниченного интернет-соединения. В вашем случае важным моментом является понимание того, как Firestore управляет кэшем, и как это может повлиять на ваш метод выборки данных.

Как работает кэширование в Firebase Firestore?

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

Ваш сценарий использования

В вашем приложении есть два типа отображаемых данных: избранные предметы и все предметы. Избранные предметы всегда загружаются и отображаются на главной странице, что предотвращает их удаление из кэша. Проблемы могут возникнуть с кэшированием всех предметов, особенно если пользователь долгое время не переходит на страницу «все предметы».

Потенциальные проблемы

Ваше беспокойство абсолютно обосновано: если пользователь долго не переходит на страницу «все предметы», документы о предметах с меньшими значениями поля last_updated могут быть удалены из кэша. При этом, если все обновленные документы не будут загружены из сети, то при запросе на сервер по вашему методу выборки (isGreaterThan) вы можете не получить полные данные, так как кэшированные документы будут отсутствовать. Таким образом, все обновления, которые произошли с предметами, не попавшими в кэш, могут не быть загружены, если их last_updated меньше, чем у избранных предметов.

Рекомендации по улучшению кэширования

  1. Частота выборки данных: Рассмотрите возможность периодической выборки и обновления «всех предметов», даже если пользователь не посещает эту страницу. Это можно сделать с помощью фоновых задач или при запуске приложения.

  2. Подписка на изменения: Используйте слушателей, которые будут моментально уведомлять ваше приложение об обновлениях в Firestore. Это обеспечит актуальность данных даже без доступа к выбранной странице.

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

  4. Хранение дополнительной информации: Вместо использования только одного массива subjectsIds, рассмотрите возможность хранения более полной информации о предметах, включая их last_updated. Это поможет избежать ситуации, когда у вас недостаточно данных для корректной выборки.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...