我正在尝试按照此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就是三个。另一方面,我害怕更改主核心数据堆栈,因为它可能会在应用程序中抛出其他内容。
解决此问题的最佳方法是什么?
答案 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];