iPhone правильное использование делегата приложения


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

myAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
user = delegate.u;

устанавливает переменную экземпляра в качестве объекта пользователя в делегате приложения и ссылается на нее оттуда, когда это необходимо плохой способ об этом? Я обычно там при входе пользователя.

хотел услышать, как профессионалы справляются с этим.

4 58

4 ответа:

обычно вы должны подключать вещи только к делегату приложения, если они:

  • были созданы из того же файла NIB, что и делегат приложения (т. е. статические элементы пользовательского интерфейса в интерфейсах одного окна)
  • связаны с обработкой событий уровня приложения, которая проходит через делегат приложения (например, пункт меню для окна настроек)

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

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

Я не собираюсь ссылаться на свой собственный блог, но если Вы Google me и singletons, вы, вероятно, найдете сообщение, которое я написал дополнительные подробности.

Мэтт слишком скромный. Его сообщение на эту тему является одним из лучших, которые я читал, и заслуживает ссылки. http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

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

// 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

The MyCommon синглтон используется в любом месте в моем приложении следующим образом:

int user = [MyCommon singleton].user;

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