我有一个带有 NSMainQueueConcurrencyType 的主要托管对象上下文的核心数据堆栈。
用户可以在托管对象上启动可能需要很长时间的任务,因此它在单独的上下文中执行:
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:mainMOC];
Person *samePerson = (Person *)[context objectWithID:person.objectID];
[context performBlock:^{
// BLOCK 1
// do lots of work
// then update the managed object
samePerson.value = someCalculatedValue;
// save the private context
NSError *error;
if (![context save:&error]) {
NSLog(@"Error: %@", error);
}
[mainMOC performBlock:^{
NSError *error;
if (![mainMOC save:&error]) {
NSLog(@"Error saving: %@", error);
}
}];
}];
这工作正常,主 MOC 得到正确更新,连接到它的 NSFetchedResultsController 正常执行,等等。
问题在于删除。我有这个设置来删除对象:
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:mainMOC];
[context performBlock:^{
// BLOCK 2
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
NSError *error;
NSArray *all = [context executeFetchRequest:request error:&error];
if (!all) {
NSLog(@"Error fetching: %@", error);
} else {
for (NSManagedObject *person in all) {
[context deleteObject:person];
}
NSError *error;
if (![context save:&error]) {
NSLog(@"Error saving: %@", error);
}
[mainMOC performBlock:^{
NSError *error;
if (![mainMOC save:&error]) {
NSLog(@"Error saving: %@", error);
}
}];
}
}];
现在,如果我在执行长时间任务(块 1)期间执行此删除操作(块 2) ,则删除操作很快完成,并保存到主上下文。一段时间后 Block 1 完成,当它保存 mainMOC 结束时,我们得到一个看似明显的崩溃:
CoreData could not fulfill a fault for ...
我的问题是:我如何执行诸如 Block 1 之类的任务,并且其对象可能被删除?