Должен ли я избегать синглтона в качестве источника данных для TabBarController (и как я могу)

Я получил TabBarController в качестве начальной сцены; каждая вкладка использует в основном одну и ту же информацию. Эта информация доступна только во время выполнения и извлекается через json. Информация не будет изменена моим приложением, но может быть изменена с другой стороны и может измениться в следующий раз, когда я обновлю ее.

Является ли это действительным случаем для синглтона?

Я думал о загрузке информации до того, как TabBarController будет создан, и передать ее на свои вкладки, но теперь я столкнулся с несколькими недостатками: (с большим AFAIK перед каждым)

  • Извлечение выполняется до того, как пользовательский интерфейс будет окрашен, это может занять некоторое время из-за медленного подключения.
  • Последующее обновление информации невозможно без миллиона уведомлений, так как я не могу передать ее обратно в иерархию.
  • Приложение не может запускаться/работать в автономном режиме и позже переключаться в онлайн.
  • Это не будет работать с раскадровкой TabBarController, потому что мне нужно перезаписать все инициации вкладок.

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

Существуют ли другие возможные решения/рекомендации по обмену данными в TabBarController?

Я надеюсь, что это не будет закрыто немедленно, поскольку я использовал слово singleton... :)


person drUniversalis    schedule 21.11.2013    source источник
comment
Как насчет создания подкласса контроллера панели вкладок и использования его в качестве источника данных для всех контроллеров содержимого? Функционально, если не формально, это синглтон, и он должен работать, если все контроллеры, которым нужны данные, являются частью его массива viewControllers.   -  person rdelmar    schedule 22.11.2013
comment
Да, это возможно, но это приведет к некоторым недостаткам, которые я описал, не так ли? Я попробовал это в другом приложении со сценами раскадровки и столкнулся с этой проблемой: заголовок stackoverflow.com/questions/17532763/ (вкратце: массив viewcontrollers пуст в tabbarcontroller)   -  person drUniversalis    schedule 22.11.2013
comment
Ваша проблема (в вашем связанном вопросе) заключалась в том, что вы использовали self.tabBarController.viewControllers - вы должны были использовать self.viewControllers из контроллера панели вкладок.   -  person rdelmar    schedule 22.11.2013
comment
Вау, спасибо. Я уже сделал все программно, но это тоже полезно знать. Вы хотите опубликовать свой ответ в моей другой теме? В противном случае я сделаю это сам позже.   -  person drUniversalis    schedule 22.11.2013


Ответы (1)


Синглтон будет работать и может считаться подходящим, но не в качестве источника данных контроллера панели вкладок. То, о чем вы говорите, должно быть одноэлементным контроллером данных. Он может владеть данными вашей модели и предоставлять методы для запуска обновлений/изменений. Он может публиковать уведомления об изменениях (ему не нужно знать, сколько контроллеров представления в настоящее время заинтересованы в изменениях).

person Wain    schedule 21.11.2013
comment
Да, это была плохая формулировка. Синглтон будет содержать данные моей модели. Хотя есть ли альтернативы? Как база данных sql? - person drUniversalis; 22.11.2013
comment
Вы могли. Даже если бы у меня была база данных, я все равно предпочел бы обернуть ее в одноэлементный контроллер, чтобы я мог опосредовать интерфейс и изменять содержимое, не влияя на контроллеры представления. - person Wain; 22.11.2013