Objective-C Альтернатива использованию ApplicationDelegate или singleton для передачи данных - PullRequest
3 голосов
/ 07 января 2012

Я работаю над выходящим приложением для iOS (которое называется Mazin в магазине приложений, если кому-то интересно), и я пытаюсь переработать код, чтобы избежать использования Application Delegate или singleton для обмена информацией / методами. В частности, у меня есть следующее, чтобы поделиться через определенные представления и контроллеры:

  • Объекты CoreData, такие как NSManagedObjectConttext и связанные пользовательские методы для взаимодействия с данными
  • Свойства состояния, используемые в нескольких местах, таких как currentMazeType, gameMode и soundIsMuted, наряду с несколькими широко используемыми служебными методами, характерными для игры
  • Представления и методы, используемые для отображения информации, обычно используемой в приложении (например, ActivityIndicator и методы для отображения / скрытия ее в заданном представлении)

Как правило, нескольким представлениям и ViewControllers требуется доступ к различным подмножествам этой информации, и мне нужен механизм для обмена информацией и методами «глобально» между этими объектами. Часть этого совместного использования предназначена для удобства (например, каждый раз, когда я хочу отобразить основной индикатор активности, я просто вызываю общий метод "startActivityIndicator"), но некоторые необходимы (например, изменение gameMode изменяет его "глобально" и несколько представлений / контроллеров необходимо получить доступ к информации общего режима).

Какие шаблоны лучше всего подойдут для этого требования? У меня есть собственное решение, и я опубликую его ниже для вашего рассмотрения / комментариев.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 января 2012

Решение, которое я рассматриваю:

Я планирую создать несколько «служебных» классов (например, GameDataUtil, AppStateUtil, GadgetsUtil), каждый из которых инкапсулирует собственное подмножество «глобальной» информации и / или методов. Каждый View или ViewController, которому требуется доступ к общей информации / методам в утилите, будет иметь соответствующее свойство данного типа (например, представление, которое может создавать звук, требует доступа к AppStateUtil, чтобы он мог определить, отключены ли звуки в данный момент) .

ApplicationDelegate будет единственным классом, который генерирует единичные экземпляры "служебных" классов и передает эти экземпляры соответствующим объектам, загружаемым из его Nib (в applicationDidFinishLaunching). Эти представления / контроллеры должны будут передать всю необходимую информацию любому из своих членов, который они могут загрузить программно (что может стать проблематичным - класс A может нуждаться в GagetsUtil для передачи его экземпляру класса B, даже если класс A никогда не будет использует утилиту напрямую).

Это похоже на внедрение зависимостей от делегата приложения вниз (поскольку у меня нет утилиты Dependency Injection Container).

Теперь я подумал о создании uber-утилиты (например, ConfigUtil), которая бы содержала одно свойство для каждой из других утилит. AppDelegate создаст один экземпляр утилиты uber (настроив его вместе с экземплярами других утилит, которые он создаст). AppDelegate будет передавать экземпляр Uber-утилиты любому, кому нужен доступ к любой из базовых утилит. Каждая базовая утилита все еще инкапсулирует подмножество общих данных / методов, но, помещая одну из них в uber-утилиту и передавая ее, мне не нужно идти в ногу с тем, какая утилита необходима для какого класса ( не только для собственного использования, но и для передачи любому из объектов-членов).

Есть какие-нибудь мысли или предложения по этому плану? Заранее большое спасибо!

0 голосов
/ 07 января 2012

NSNotification будет шагом от этой модели, и, как правило, его легко реализовать.

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

Обновление

Я вспомнил, что написал более подробный ответ на подобный сценарий здесь, в SO .

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