Я склонен не соглашаться с этим паттерном.
Прежде всего я пытаюсь рассматривать Базовые Данные как деталь реализации, и как любую деталь реализации она должна быть скрыта за хорошим фасадом.Фасад - это интерфейсы, которые я выставляю для своих модельных объектов.Например, если у меня есть два объекта модели;Cource
и Student
, любой курс может иметь несколько студентов.Я не хочу, чтобы контроллер взял на себя обязанность устанавливать предикаты и сортировать дескрипторы, а также перепрыгивать через все циклы Core Data, чтобы получить список учеников для определенного класса.Существует совершенно правильный способ показать это в модели:
@interface Cource (StudentAccess)
-(NSArray*)studentsStortedByName;
@end
Затем раз и навсегда реализуйте уродливые вещи в классе Model.Скрытие всех сложных деталей Core Data и отсутствие необходимости передавать контексты управляемого объекта.Но как мне найти источники, это должно начаться где-то правильно?Да, это так, но вам не нужно выставлять его контроллеру.Добавление таких методов также вполне разумно:
@interface Cource (CourceAccess)
+(Cource*)caurceByID:(NSString*)courceID;
+(NSArray*)allCources;
+(NSArray*)courcesHeldByTeacher:(Teacher*)teacher;
@end
Это также помогает минимизировать зависимости между контроллерами.И уменьшение зависимости между моделью и контроллером.Предполагая, что у меня есть CourceViewController
и StudenViewController
, я не скрывал детали базовых данных за фасадом и хотел бы также обойти контекст управляемого объекта, и в итоге я получил бы назначенный инициализатор, подобный этому:
-(id)initWithManagedObjectContext:(NSManagedObjectContext*)moc
student:(Student*)student;
В то время как с хорошим хорошим фасадом я получаю следующее:
-(id)initWithStudent:(Student*)student;
Минимизация зависимостей за фасадами в пользу внедрения зависимостей также значительно упрощает изменение внутренних реализаций.Передача контекста управляемого объекта поощряет каждый контроллер реализовывать свою собственную логику для базовых вещей.Возьмем для примера метод studentsSortedByName
.Сначала это может быть сортировка по фамилии / имени, если позже изменить на сортировку по фамилии / имени, вам придется перейти к каждому контроллеру, который отсортировал студентов, и внести изменения.Там, где хороший метод фасада требует изменения одним методом, и все контроллеры автоматически получают обновление бесплатно.