2016-12-29 42 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];