目前[2015年5月] Apple Concurrency with Core Data documentation充其量是误导性的,因为它不包括iOS 5中的任何增强功能,因此不再显示同时使用核心数据的最佳方式。iOS 5中有两个非常重要的更改 - 父上下文和新并发/线程类型。
我还没有找到全面涵盖这些新功能的书面文档,但WWDC 2012 video "Session 214 - Core Data Best Practices"确实很好地解释了这一点。
Magical Record使用这些新功能,可能值得一看。
真正的基础仍然是一样的 - 你仍然可以只使用托管对象的管理对象上下文创建线程。
您现在可以使用[moc performBlock:]在右侧线程上运行代码。
没有必要使用mergeChangesFromContextDidSaveNotification:anymore;而是创建一个子上下文来进行更改,然后保存子上下文。保存子上下文将自动将更改推送到父上下文中,并将更改保存到磁盘,只需在其线程中执行父上下文的保存即可。
对于这个工作,你必须创建一个并发类型父上下文,如:
mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
然后在后台线程:
context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[context setParentContext:mainManagedObjectContext];
<... perform actions on context ...>
NSError *error;
if (![context save:&error])
{
<... handle error ...>
}
[mainManagedObjectContext performBlock:^{
NSError *e = nil;
if (![mainContext save:&e])
{
<... handle error ...>
}
}];
我发现CoreDataBooks融合背景下的一个很好的例子(mergeChangesFromContextDidSaveNotification)。 非常感谢。 祝您有愉快的一天。 保罗又名SlowTree – SlowTree 2010-01-26 10:22:45
哦,谢天谢地。我读这个解决了我的问题。 正在后台线程中导入大量数据并获取大量不可预知的异常。 在后台线程中实例化上下文而不是传递它似乎修复了我的isses。 – tobyc 2010-05-25 03:41:03
本文档尚未更新,以利用iOS 5中非常重要的改进 - 我在我的答案中链接的视频现在是更好的参考。 – JosephH 2012-08-05 08:24:35