我的情况:假设我有一个类Person
(NSManagedObject 的子类)。每次用户单击按钮时,都会创建一个新的 Person 实例并将其添加到全局 NSMutableArray。新创建的 Person 实例也将被添加到子上下文中,如下所示:
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateConcurrencyType];
[childContext setParentContext: _mainContext];
同样,当单击按钮时,我会保存上下文:(它有点复杂,但遵循这个结构)
[childContext performBlock:^{
[childContext save:nil];
[_mainContext save:nil];
}];
在我的数组中的按钮对象上单击两次或更多次(不确定是否取决于总点击次数)后变为fault
.
根据文档:访问故障对象的属性应该加载持久对象。
即使当我访问我的 NSManagedObject 的属性时,该对象仍然是错误的并且属性是nil
.
为什么我的数组中的对象出现故障,我如何访问故障对象的属性?
编辑:
加载 UIViewController 时,我从数据存储区获取所有现有对象:
-(NSArray*)fetchPersons {
NSManagedObjectContext *context = [self managedObjectContext]; //this is _mainContext, it is created with initWithConcurrencyType:NSMainQueueConcurrencyType
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *description = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
[fetchRequest setEntity:description];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"key = %i", aCondition];
[fetchRequest setPredicate:predicate];
return [context executeFetchRequest:fetchRequest error:nil];
}
我正在使用这个 NSArrayfetchPersons
来填充 NSMutableArray。
创建一个新的 Person 对象:
-(Person*)createPerson {
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateQueueConcurrencyType];
[childContext setParentContext:[self managedObjectContext]];
Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:childContext];
return person;
}
我不确定如何处理带有 òbjectID 的对象。我使用 childContext 作为临时上下文。有时我需要一个 Person 实例,但我不想将它保存到持久存储中(或者在开始时将其插入到主上下文中)。
在所有这些步骤之后,我的 NSMutableArray 中有所有对象。在创建一些对象并尝试记录它们的属性(person.name
或其他东西)后,我得到了 nil 属性(故障对象)。