iOS разделяет «глобальные данные» между контроллерами представления - PullRequest
7 голосов
/ 01 сентября 2011

Я использую делегат приложения как «глобальное ведро» для обмена данными между различными контроллерами представления.Обычно я делаю что-то вроде этого:

My_AppDelegate *appDelegate = (My_AppDelegate *)[[UIApplication sharedApplication] delegate];

И затем я вставляю данные в appDelegate и собираю данные из appDelegate с помощью другого контроллера представления.Почему-то это кажется неуклюжим и неуместным (хотя и работает).

Есть ли лучший способ?Могу ли я настроить «слушателя» на какую-то глобальную область общего доступа, если кто-то вставит туда элемент данных, другой объект получит «обратный вызов», чтобы сообщить, что у кого-то есть данные, готовые для него?1006 *

В Java мы делали это с помощью класса Observer / Observable - может быть, есть что-то подобное или лучше в iOS?

1 Ответ

3 голосов
/ 01 сентября 2011

Более чистый, хотя и не обязательно другой, способ сделать это состоит в создании одноэлементного класса, например AppData, к которому вы можете получить доступ различными способами, и который будет доступен для всех ваших других классов. Преимущество этого состоит в том, что вы отделяете специфичные для вашего приложения вещи от делегатов приложений. Вы можете определить класс следующим образом:

@interface AppData : NSObject

// Perhaps you'll declare some class methods here...

@end

Обычная вещь, которую я делаю, - это определение методов класса для такого класса для доступа, например, к значениям настроек, специфичным для приложения константам или другим одноэлементным объектам. Есть много возможностей.

В конце концов, вы можете многое сделать с помощью только методов класса, которые вы бы назвали как-то вроде [AppData theMethod]. Просто помните, что self нет доступа внутри метода класса.

Сделав еще один шаг вперед, вы можете определить ivars для класса AppData и затем управлять одноэлементным экземпляром AppData. Используйте метод класса, например +sharedInstance, чтобы получить указатель на синглтон, по которому вы могли бы затем вызывать методы. Например, [[AppData sharedInstance] someMethod:myArgument]. Ваша реализация +sharedInstance может быть там, где вы управляете фактическим созданием синглтона, которое в конечном итоге возвращает метод.

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

...