iOS общие объекты

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

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

Теперь я изменил свое приложение для создания и инициализации базовых объектов в appDelegate "didFinishLaunching...". Теперь это работает, и я могу получить доступ к этому общему объекту из всех других моих представлений без необходимости передавать ссылку из одного представления в другое.

Прежде чем я зайду и продолжу слишком далеко, я надеялся узнать мнение людей о том, является ли это правильным способом делать что-то, или я должен делать что-то еще? Извините, если это кажется тривиальным вопросом, я только учусь и хочу научиться делать все правильно.

Заранее спасибо:-)

2 ответа

Решение

Не повторяя того, что уже было дано, я бы посоветовал вам создать свой собственный объект Singleton для хранения ваших "глобалов", чтобы вы не загромождали им свой AppDelegate.

@interface MyGlobalDataController : NSObject

@property (nonatomic, strong) MyData *myData;

+(MyGlobalDataController *)sharedInstance;

@end

@implementation MyGlobalDataController

static MyGlobalDataController *MyGlobalDataControllerSharedInstance = nil;

- (id)init {
    self = [super init];
    if (self) {
        // do whatever needs doing 
    }
    return self;
}

+(MyGlobalDataController *)sharedInstance {
    @synchronized(self) {
        if (MyGlobalDataControllerSharedInstance == nil) {
            MyGlobalDataControllerSharedInstance = [[MyGlobalDataController alloc] init];
        }
    }
    return MyGlobalDataControllerSharedInstance;
}

@end

При первом обращении к вашему sharedInstance будет вызвана инициализация, поэтому вам не нужно беспокоиться о времени там.

Поместить инициализацию глобального объекта в didFinishLaunching - это лучшая идея, чем иметь его в didLoad.

Некоторые люди не согласятся со мной здесь и скажут, что вам не следует полностью останавливать глобалы, но лично я думаю, что наличие какого-то глобального состояния приемлемо. Мне нравится хорошее объектно-ориентированное приложение, но необходимо соблюдать баланс между надежным ООП и гибкостью, обеспечиваемой наличием нескольких глобальных переменных.

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

В настоящее время я в основном придерживаюсь принципов MVC / OOP, но у меня есть синглтон [AppDelegate]sharedAppDelegate], который я могу использовать для доступа к переменным в определенных точках. У меня здесь очень и очень мало переменных, но они пригодятся, то есть теперь у моего приложения есть общий "загрузочный HUD", которым управляет этот класс, и мой sharedAppDelegate также содержит множество статических методов для инициации HTTP, анализа JSON и т. Д. что экономит много времени.

Одной из альтернатив наличию глобальной информации в вашем appDelegate является использование NSUserDefaults для хранения информации о значении ключа

Надеюсь, что в любом случае это поможет, как я уже говорил, некоторые люди со мной не согласятся, но в конечном итоге все сводится к личным предпочтениям, и в этом случае баланс между вами с точки зрения жесткости модели MVC и гибкости

Другие вопросы по тегам