Core Data загружает объекты лениво, и он должен вводить любые объекты, как только вы пытаетесь ссылаться на них. Однако я столкнулся с парой проблем с этой схемой.
Objective C 2.0 быстрое перечисление объектов в отношении (наборе) может завершиться ошибкой (поскольку объекты в наборе еще не загружены), и функция awakeFromFetch не вызывается до тех пор, пока не будет затронут элемент объекта, управляемого основными данными.
Например, если у меня есть отношение в подклассе NSManagedObject, например:
@property (retain) NSSet* clips;
Сразу после извлечения экземпляра этого объекта, если я попытаюсь использовать быстрое перечисление, такое как:
for (PClip* clip in self.clips) {
// do something with the clip
}
тело цикла никогда не выполняется. В отладчике вы можете видеть, что набор клипов (экземпляр _NSFaultingMutableSet во время выполнения) изначально пуст.
Или, скажем, у меня есть непостоянный член объекта клипа, полученный из постоянного состояния:
@property (retain) NSString* filename
Я синхронизирую это с использованием метода awakeFromFetch, но awakeFromFetch не вызывается до тех пор, пока сначала не будет вызван какой-либо постоянный член объекта, поэтому, если какой-либо код пытается получить доступ к этому непостоянному значению до загрузки объекта, он еще не будет быть определено (то есть будет ноль).
Использование setReturnsObjectsAsFaults: метод в запросе на выборку, похоже, не помогает. Похоже, он не заставляет извлекать все дерево объектов, прикрепленных к извлеченному объекту.
Как лучше всего загружать объекты перед работой с ними? Почему быстрое перечисление не привело к загрузке набора объектов?