it-swarm.com.ru

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

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

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

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

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

58
Coocoo4Cocoa

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

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

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

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

Я не собираюсь ссылаться на свой собственный блог, но если вы будете гуглить меня и синглтоны, вы, вероятно, найдете пост, который я написал, более подробно.

52
Matt Gallagher

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

31
Brad The App Guy

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

// 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;
13
e.James

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

3
Jason Coco