Допустим, у меня есть следующий код:
@interface ParentMO: NSManagedObject
@property NSString *inheritedProperty;
@end
@interface ChildMO: ParentMO
@property NSString *childProperty;
@end
Теперь, где-то в @implementation
какого-то другого класса:
NSFetchRequest *fetchRequest = [NSFetchRequest new];
fetchRequest.entity = [NSEntityDescription entityForName:NSStringFromClass([ChildMO class]) inManagedObjectContext:context];
fetchRequest.resultType = NSManagedObjectResultType;
self.managedObjects = [context executeFetchRequest:fetchRequest error:nil];
И когда я пытаюсь получить доступ к какому-либо свойству родительского класса управляемых объектов, он все равно возвращает ноль, несмотря на то, что данные ядра должны вызывать сбои при попытке доступа к свойствам ManagedObject:
ChildMO *managedObject = self.managedObjects.firstObject;
NSLog(@"%@", managedObject.inheritedProperty); // prints "nil"
NSLog(@"%@", managedObject.childProperty); // prints "nil"
Но, если я сначала получу доступ к дочернему свойству, все свойства будут сброшены, включая те, которые унаследованы от ParentMO
:
ChildMO *managedObject = self.managedObjects.firstObject;
NSLog(@"%@", managedObject.childProperty); // prints the property's contents correctly
NSLog(@"%@", managedObject.inheritedProperty); // prints the property's contents correctly
Я хотел бы знать, почему это работает так, и возможно ли заставить его работать так, как ожидалось. Я знаю, что мы можем использовать fetchRequest.returnsObjectsAsFaults = NO;
, но я хотел бы знать, есть ли другое решение, потому что это похоже на то, что мы не позволяем Core Data выполнять оптимизацию (то есть сбои и сбои) так, как это было разработано Apple.