的iOS/Objective-C的:保存到核心数据在后台线程
问题描述:
我试图遵循最佳实践保存到核心数据在后台这款苹果示例代码,其中包括该代码:的iOS/Objective-C的:保存到核心数据在后台线程
NSArray *jsonArray = …; //JSON data to be imported into Core Data
NSManagedObjectContext *moc = …; //Our primary context on the main queue
NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:moc];
我主要MOC是保存在一个属性中。然而,无论我的Alloc初始化一个新的MOC或使用该属性的一个,我得到的错误:
'Parent NSManagedObjectContext must use either NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType.'
*** First throw call stack:
对此的解决方案是说指定并发类型的MOC如下:
managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
这应该在主核心数据栈中完成吗?或者你创建一个新的MOC?我试图创建一个新的MOC,并得到一个MOC为空的错误。创建第二台MOC似乎是多余的,私人一台可以制造三台。另一方面,我害怕改变主核心数据栈,因为它可能会在应用程序中抛出其他东西。
解决此问题的最佳方法是什么?
答
主要MOC应该是背景私人moc而不是其他地方的孩子。每当你保存主要的moc时,私有moc就会得到更新(因此你需要设置mergePolicy)然后保存到磁盘。在这种情况下,你不需要超过2个mocs。
因为保存将在后台线程中,您的代码将在主线程中运行更平滑。
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; // primary context on the main queue
moc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
NSManagedObjectContext *privateMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
privateMoc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
[moc setParentContext:privateMoc];