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 и гибкости