Работа с кэшем в приложении

Korrekted
Korrekted
Last updated 

Общее

Ключевой целью интеграции контролируемого кэша в приложении является:
  • обеспечение быстрой загрузки индексов контента (первые экраны разделов «Медитации», «Истории», «Сцены») при первом запуске приложения за счёт прекеширования контента
  • быстрое реагирование на изменений контента, аккумулирование новой версии с единовременной загрузкой

Ключевые принципы организации хранилища и работы кеша

  1. Приложение кеширует не только индивидуальные файлы (что уже реализовано стандартными компонентами), но и app-specific структуру разделов с контентом. То есть внутри приложения сохраняется индекс страницы раздела, например, с историями — сохранено сколько историй представлено в разделе, для каждой из них сохранено название и имя автора или человека, который читает историю, а также картинку-миниатюру, отображаемую в индексе историй («карточка» истории).
  2. Приложение также кеширует сам материал, будь то история, медитация или сцена. Например, для истории приложение кеширует название, автора/зачитывающего, полноценную иллюстрации (во весь экран, которая не отображается в индексе историй, но отображается на индивидуальном экране) и прочие необходимые нюансы, кроме самой аудиодорожки (условились пока не сохранять аудио на устройство)
  3. Бекенд для каждого индекса (списка материалов) и для индивидуального материала возвращает его hash — фактически контрольную сумму всех атрибутов для материала или всех материалов для раздела. Если у приложения в кеше есть материал с указанным на бекенде hash'ем, то кеш актуален и можно отображать пользователю данные из кеша. Если же hash'а на клиенте нет (т.е. материал ни разу не был скачан) или он отличается от значения на сервере (материал на сервере изменился), следует скачать и сохранить материал (т.е. сохранить доступные текстовые мета-данные и картинки)
  4. Приложение поставляется с предзаполненным кешем, отражающем актуальное на момент выпуска состояние контента.
  5. Точкой синхронизации мета-данных всего контента (индексов и индивидуальных материалов) в приложении является холодный запуск приложения. Алгоритм работы для каждой из видов контента (медитации, сцены, истории) следующий:
    • Приложение обращается к endpoint'у /list для получения списка медитаций. В ответе обязательно будет содержаться hash всех медитаций
    • ...
              "meditations_hash": "sdfsd343h4fh82fb0f4g0h83u94"
      ...
    • Приложение сравнивает полученный от бекенда hash со значением из кеша
    • Если hash отличается:
      • приложение проходится по всем элементам массива (т.е. материалам) и перечитывает информацию для каждого из них, если hash индивидуального материала отличается 
      • {
            "id": 1,
            "name": "The Snowfall",
            "paid": false,
            "reader": "Elizabeth McCane",
            "thumb_image_url": "https://sleepwell.app/img/meditations/snowfall_thumb.jpg",
            "meditation_hash": "024gh3gn4b8gf9234ng30hg439g"
        }
      • В случае отсутствия такого материала вообще, его следует добавить в кеш
      • Материалы в кеше, ID которых отсутствуют в списке от бекенда, следует удалить из кеша
    • Данный алгоритм повторяется для всего типа контента (медитации, сцены, истории)
  6. После синхронизации кеша приложение отображает пользователю данные из кеша до следующего холодного запуска приложения
  7. При обращении к конкретному материалу прилоежение запрашивает релевантный endpoint /get, передавая туда id материала и получая данные со ссылками на аудио-дорожки материала
  8. Таким образом на данный момент приложение кеширует абсолютно все мета-данные индексов и материалов. Это означает, что у этого подхода есть ряд ограничений/недостатков:
    1. Нет управления размером кэша и теоретически приложение может начать выходить за комфортные пользователю пределы (теоретически — так как размер кеша для всего контента относительно маленький и измеряется не более 20 Мб, что равноценно 4 фотографиям, сделанных на современную камеру телефона). Об этой проблеме (т.е. внедрению необходимости механизма управления кешем в настройках) мы подумаем позже
    2. Опять же теоретически может возникнуть ситуация, когда в кеш не могут быть добавлены данные о новом/обновлённом контенте из-за отсутствия места на устройстве. Это крайне маловероятный сценарий на первое время, однако в таком случае пользователь будет просматривать устаревшие индексы и описания контента. Возможно также, что какой-то контент из просматриваемого через кеш в реальности на бекенде будет удалён — в таком случае при попытке его просмотреть пользователь увидит уведомление об ошибке.
    3. Так как точкой синхронизации кеша и актуального контента на бекенде является холодный старт приложения, после которого пользователь фактически просматривает данные из кеша при навигации по экранам, то финальным ограничением является ситуация, при которой актуальный контент на бекенде обновляется уже после синхронизации, но до выгрузки приложения. При текущем подходе пользователь по-прежнему будет видеть старую версию контента. В будущем это можно дополнительно обработать.