2016-12-29 40 views
0

我试图遵循最佳实践保存到核心数据在后台这款苹果示例代码,其中包括该代码:的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似乎是多余的,私人一台可以制造三台。另一方面,我害怕改变主核心数据栈,因为它可能会在应用程序中抛出其他东西。

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

回答

0

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