Android кеш с CRUD

Я работаю над приложением типа социальной сети, где пользователь видит список "постов" и может взаимодействовать с ними, в частности, они могут им "нравиться".

Список постов находится в десятках тысяч, и поэтому мы разбиваем его на страницы с помощью библиотеки подкачки Android (DB + Network), но это применимо к любой ситуации, когда существуют кэшированные объекты, которые необходимо изменить.

Загрузка и разбиение на страницы списка работают отлично, очень отзывчивы, а встроенные анимации хороши. Проблема в том, что пользователю нравится пост. Для того, чтобы понравиться сообщение, есть кнопка на элемент списка. Когда пользователю нравится (или "не нравится") публикация, значок кнопки меняется, и "количество лайков" соответственно увеличивается или уменьшается, и мы должны позвонить в соответствующий веб-сервис. Это все основные социальные сети и кажется довольно простым, но я пытаюсь найти правильное и эффективное обновление данных. Пока что у меня есть три варианта, но все они отстой:

  1. сделайте запрос и получите обновленный объект, затем снова вставьте его в базу данных. Это просто и гарантирует, что данные верны, но это означает, что пользователь должен ждать возврата запроса, прежде чем обновится пользовательский интерфейс, что обычно приводит к тому, что пользователь нажимает несколько раз на изображении (выполняя несколько запросов). Так что в значительной степени бесполезно.
  2. измените пользовательский интерфейс (представление элемента списка обновляет его визуальное состояние), но не данные поддержки, затем сделайте запрос и вставьте результат обратно в БД. Это огромный PITA, поскольку он приводит к визуальному состоянию, которое не синхронизировано, поэтому, если пользователь прокручивает и возвращается до завершения запроса, он увидит исходное состояние. Я также должен сообщить об ошибках обратно к представлению, чтобы оно могло вернуть свое состояние.
  3. измените объект в памяти (измените число подобий и отношение пользователя к записи), сделав копию оригинала, повторно вставьте ее в базу данных, сделайте запрос, затем вставьте обновленный объект из веб-службы или исходный объект в случай ошибки. Это дает мгновенную визуальную обратную связь и сохраняет целостность данных, но лишь незначительно меньше PITA.

Итак, на данный момент я собираюсь с 3, потому что это кажется лучшим, но мне интересно, есть ли лучший способ справиться с этим? Кажется, что я бьюсь головой о такой базовой функциональности, наверняка эта проблема была решена миллион раз раньше? Я не привык работать с кэшированием в системах CRUD (я реализовал базовое кэширование данных только для чтения), но изменение кэша оказалось большим препятствием, чем я ожидал.

0 ответов

Другие вопросы по тегам