Вопрос или проблема
Я прочитал в документации, что 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
меньше, чем у избранных предметов.
Рекомендации по улучшению кэширования
-
Частота выборки данных: Рассмотрите возможность периодической выборки и обновления «всех предметов», даже если пользователь не посещает эту страницу. Это можно сделать с помощью фоновых задач или при запуске приложения.
-
Подписка на изменения: Используйте слушателей, которые будут моментально уведомлять ваше приложение об обновлениях в Firestore. Это обеспечит актуальность данных даже без доступа к выбранной странице.
-
Контроль кэширования: Изучите возможности ручной настройки кэширования в вашем приложении. Создайте механизм для принудительного обновления кэша перед запросом данных, чтобы гарантировать, что все нужные документы будут загружены.
-
Хранение дополнительной информации: Вместо использования только одного массива
subjectsIds
, рассмотрите возможность хранения более полной информации о предметах, включая ихlast_updated
. Это поможет избежать ситуации, когда у вас недостаточно данных для корректной выборки.
Заключение
Кэширование — это мощный инструмент, который позволяет вашим приложениям работать эффективно и быстро. Однако важно понимать механизмы, контролирующие это кэширование, чтобы избежать потенциальных проблем с выбросом данных. Пересмотрев процессы выборки данных и оптимизировав их, вы сможете обеспечить стабильность работы вашего приложения и высокую актуальность отображаемой информации.