核心数据无法解决托管对象的继承属性中的错误

时间:2019-05-27 08:30:07

标签: ios objective-c core-data

假设我有以下代码:

@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的属性时核心数据会引发错误,但它仍将返回nil:

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的设计方式进行优化(即,错误和无错)。

0 个答案:

没有答案