Собственное использование приложения делегата приложения iPhone
Я ищу, чтобы иметь возможность ссылаться на определенные состояния/объекты через любое место в моем приложении. Например, пользователь регистрируется в своем приложении, мне нужно вызвать веб-службу и получить информацию о пользователях. Затем я хочу получить доступ к этой информации из любого места приложения с помощью следующего:
myAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
user = delegate.u;
Устанавливает переменную экземпляра как объект User в делегате приложения и ссылается на него оттуда, когда это необходимо, плохой способ? Я обычно устанавливаю его там при входе пользователя.
Хотел услышать, как профессионалы справляются с этим.
Ответы
Ответ 1
Как правило, вы должны подключать вещи только к делегату приложения, если они:
- Были созданы из того же файла NIB, что и делегат приложения (т.е. статические элементы пользовательского интерфейса в интерфейсах одного окна).
- Связаны с обработкой событий на уровне приложения, которая проходит через делегат приложения (например, пункт меню для окна настроек)
Для всего остального вы должны создать singleton, который управляет доступом к ним.
Джейсон Коко предложил проложить маршрут через Application Controller. В моих программах я обычно избегаю этого, так как я считаю, что он накладывает слишком большую ответственность на высший уровень - я думаю, что все должно быть самоконтролем, где это возможно, и что управление более высоким уровнем должно использоваться только тогда, когда есть потребность в координации между экспертами, уровневые модули.
Я не собираюсь связывать свой собственный блог, но если вы Google и синглеты вы, вероятно, найдете сообщение, которое я написал, более подробно.
Ответ 2
Мэтт немного скромнее. Его публикация на эту тему является одним из лучших, которые я прочитал, и заслуживает ссылки. http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
Ответ 3
Я не вижу проблем с вашим подходом. Обычно я использую синглтон, чтобы справиться с этой ситуацией:
// MyCommon.h:
@interface MyCommon
class MyCommon : NSObject
{
int user;
};
@property(assign) int user;
+ (MyCommon *)singleton;
@end
// MyCommon.m:
@implementation MyCommon
static MyCommon * MyCommon_Singleton = nil;
+ (MyCommon *)singleton
{
if (nil == MyCommon_Singleton)
{
MyCommon_Singleton = [[MyCommon_Singleton alloc] init];
}
return MyCommon_Singleton;
}
@end
Синтаксис MyCommon
затем используется в любом месте моего приложения следующим образом:
int user = [MyCommon singleton].user;
Ответ 4
Обычно вы запрашивали бы у своего контроллера приложений эту информацию, и он отвечал бы за знание того, как его хранить/искать в любой модели данных. Контроллер вашего приложения может быть или не быть таким же, как делегат приложений (в большинстве простых приложений это одно и то же).