Swift / iOS - Совместное использование состояния модели между контроллерами представления - PullRequest
0 голосов
/ 18 октября 2018

У меня есть вопрос относительно разделения состояния модели между View Controllers.

Давайте рассмотрим пример: приложение Twitter.В ленте временной шкалы вы видите список статусов, которые загружаются из API и сериализуются как модели.И в ленте упоминаний, у вас также есть список статусов.Они также загружаются из API, сериализуются как модели, но как разные экземпляры.Если пользователь нажимает сердечную кнопку в ленте новостей, он также должен отображаться как понравившийся твит в ленте времени.Но это означает разделение состояния двух разных экземпляров модели, которые представляют одно и то же обновление состояния.

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

static var cache: Array<Status> = Array<Status>()

и использовал вспомогательные методы, чтобы всегда использовать один экземпляр для каждого сообщения, независимо от того, чтоПосмотреть контроллер они загружены / изменены.

Это анти-паттерн?Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Просто перефразировать первым.

  • Get API A возвращает массив A [X, Y, Z]
  • Get API B возвращает массив B [M, Y, F]
  • Просмотр контроллера A показывает массивA
  • Контроллер вида B показывает массив B
  • Объекты не сохраняются

Пользователь изменяет Y в контроллере вида A, но контроллер вида B не показывает обновления.

  • Вариант 1: Поместите все объекты в один массив и добавьте механизм, который должен знать, что должно отображаться в контроллерах представления A и B
  • Вариант 2: Когда происходит обновление в любом массиве,обновить другой массив, если элемент существует
  • Вариант 3: обработчики Get A и Get API B сохраняют результаты в arrayC или dictionaryC, но также поддерживают arrayA и arrayB.Однако A и B больше не содержат экземпляры объектов, а ссылаются на объекты в arrayC или dictionaryC.Это на самом деле просто реализация варианта 1. Я получил словарь C, где ключ - это UUID объекта, сохраненного в значении, а массив A & B просто хранит ключи.

Конечно, естьдругие параметры, такие как отправка уведомления, чтобы другой контроллер представления знал, как обновить данные.

Не думаю, что вам следует идти по пути синхронизации разных экземпляров.

0 голосов
/ 18 октября 2018

Если я не ошибаюсь, Твиттер использует Firebase, поэтому автообновление происходит только благодаря живому наблюдению за базой данных.Возможно, вам следует подумать о наблюдении изменений в ваших объектах и ​​обновлять коллекции, на которых основаны ваши представления.Хотя я не знаю вашей точной архитектуры.

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