правильное использование iPhone делегата приложения - PullRequest
58 голосов
/ 04 декабря 2008

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

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

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

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

Ответы [ 4 ]

52 голосов
/ 04 декабря 2008

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

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

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

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

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

31 голосов
/ 05 декабря 2008

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

13 голосов
/ 04 декабря 2008

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

// 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;
3 голосов
/ 04 декабря 2008

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

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