目前[2015年5月] Apple Concurrency with Core Data documentation充其量是誤導性的,因爲它不包括iOS 5中的任何增強功能,因此不再顯示同時使用核心數據的最佳方式。iOS 5中有兩個非常重要的更改 - 父上下文和新併發/線程類型。
我還沒有找到全面涵蓋這些新功能的書面文檔,但WWDC 2012 video "Session 214 - Core Data Best Practices"確實很好地解釋了這一點。
Magical Record使用這些新功能,可能值得一看。
真正的基礎仍然是一樣的 - 你仍然可以只使用託管對象的管理對象上下文創建線程。
您現在可以使用[moc performBlock:]在右側線程上運行代碼。
沒有必要使用mergeChangesFromContextDidSaveNotification:anymore;而是創建一個子上下文來進行更改,然後保存子上下文。保存子上下文將自動將更改推送到父上下文中,並將更改保存到磁盤,只需在其線程中執行父上下文的保存即可。
對於這個工作,你必須創建一個併發類型父上下文,如:
mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
然後在後臺線程:
context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[context setParentContext:mainManagedObjectContext];
<... perform actions on context ...>
NSError *error;
if (![context save:&error])
{
<... handle error ...>
}
[mainManagedObjectContext performBlock:^{
NSError *e = nil;
if (![mainContext save:&e])
{
<... handle error ...>
}
}];
我發現CoreDataBooks融合背景下的一個很好的例子(mergeChangesFromContextDidSaveNotification)。 非常感謝。 祝您有愉快的一天。 保羅又名SlowTree – SlowTree 2010-01-26 10:22:45
哦,謝天謝地。我讀這個解決了我的問題。 正在後臺線程中導入大量數據並獲取大量不可預知的異常。 在後臺線程中實例化上下文而不是傳遞它似乎修復了我的isses。 – tobyc 2010-05-25 03:41:03
本文檔尚未更新,以利用iOS 5中非常重要的改進 - 我在我的答案中鏈接的視頻現在是更好的參考。 – JosephH 2012-08-05 08:24:35