Хранение глобальных объектов в AppDelegate становится по-настоящему уродливым по мере масштабирования вашего проекта.
Задайте себе вопрос: какова взаимосвязь между этими объектными объектами и другими объектами в моем приложении?Является ли отношение 1-к-1 или 1-к-n.Если вам нужна только одна модель для доступа к различным объектам, тогда используйте одноэлементный подход.Если вам нужен один объект, чтобы иметь ровно одну модель, сохраняйте указатель на него в этом объекте.
При столкновении с другими, но вычислительно правильными, проектными альтернативами следует учитывать несколько областей
- Какой подход минимизирует количество строк кода?
- Какой подход вызывает наименьшее количество связей и семантических связей?
- С точки зрения программиста, новичка в проекте, такой подход легче понятьподдерживать и усложнять непреднамеренное введение ошибок.
Если вы начнете внедрять глобальные модели в AppDelegate, вы в конечном итоге создадите монолитный класс, который будет трудно понять и труднее поддерживать.Если вы создаете указатель на модель в каждом контроллере, вы должны передавать ссылку на эту модель каждый раз, когда создается новый элемент управления, и он должен передавать указатель на любой нужный объект, который он создает.По сути, вы создали каскадный водопад, передающий тот же указатель, раздутый файл интерфейса и конструктор.Представьте, что вместо 1 модели вам нужно отслеживать 5 модельных объектов.Имеет ли смысл для объектов иметь 5 указателей на 5 моделей, которые необходимо передавать конструктору каждый раз?Вот как сделать ваши проекты ошибочными и не поддерживаемыми.
На случай, если это не очевидно.AppDelegate - это всего лишь синглтон.Когда вы катите все свои модели в своем делегате приложения, вы не избежали использования синглетонов, вы просто создали монолитную.
Относительно KVO: Это зависит от того, чего вы пытаетесь достичь.Я приведу пример, где КВО является полезным.Предполагается, что у вас есть объект модели, хранящий пользовательские настройки приложения.
@interface SettingsModel
.....
@property (nonatomic, retain) UIColor * backgroundColor;
@end
Другие представления в приложении должны немедленно обновлять свой цвет фона при каждом изменении этих настроек.Это можно легко решить с помощью KVO:
[[SettingsModel getInstance] addObserver:self forKeyPath:@"backgroundColor" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"backgroundColor"]){
self.view.backgroundColor = [[SettingsModel getInstance] backgroundColor];
}
}