iOS / Objective-C:保存到后台线程中的核心数据

时间:2016-12-29 03:16:12

标签: ios core-data concurrency

我正在尝试按照此Apple示例代码进行最佳实践,以便在包含此代码的后台保存到核心数据:

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是保存在一个属性中。但是,无论我为init分配一个新的MOC还是使用属性中的一个,我都会得到错误:

'Parent NSManagedObjectContext must use either NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType.'
*** First throw call stack:

据说这个解决方案指定MOC的并发类型如下:

managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

这应该在主核心数据堆栈中完成吗?或者您是否创建了新的MOC?我尝试创建一个新的MOC并得到MOC为空的错误。创建第二个MOC似乎也是多余的,私有的MOC就是三个。另一方面,我害怕更改主核心数据堆栈,因为它可能会在应用程序中抛出其他内容。

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

主要的MOC应该是后台私人moc的孩子,而不是其他方面。无论何时保存主moc,私有moc都会更新(因此您需要设置mergePolicy),然后保存到磁盘。在这种情况下,您不需要超过2个moc。

因为保存将在后台线程中,所以您的代码将在主线程中运行得更顺畅。

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];