我有一個核心數據應用程序。在生產者線程中,我從Web服務中提取數據並將其存儲在我的對象中並調用save。 我的使用者對象是顯示相同的表格視圖控制器。 然而,應用程序崩潰,我得到 NSFetchedResultsController錯誤:希望找到對象(單位:FeedEntry; ID:0xf46f40;數據:)在第(空)刪除核心數據生產者消費者問題
在控制檯上。當我調試它時,一切正常。所以我明白這就像種族問題。
這些問題如何解決?使用核心數據設計生產者 - 消費者應用程序的最佳方式是什麼?
我有一個核心數據應用程序。在生產者線程中,我從Web服務中提取數據並將其存儲在我的對象中並調用save。 我的使用者對象是顯示相同的表格視圖控制器。 然而,應用程序崩潰,我得到 NSFetchedResultsController錯誤:希望找到對象(單位:FeedEntry; ID:0xf46f40;數據:)在第(空)刪除核心數據生產者消費者問題
在控制檯上。當我調試它時,一切正常。所以我明白這就像種族問題。
這些問題如何解決?使用核心數據設計生產者 - 消費者應用程序的最佳方式是什麼?
如果您的目標是Leopard或更高版本,Apple已經讓事情變得更輕鬆。
在您的生產者線程中,創建一個與主線程中的MOC具有相同PSC的MOC。您可以在此線程中從您的web服務中提取對象,創建新對象並將其保存爲正常。
在您的消費者線程中,將您的控制器添加爲NSManagedObjectContextDidSaveNotification的觀察者。你的回調應該是這個樣子:
- (void) managedObjectContextDidSave:(NSNotification *)notification
{
NSManagedObjectContext *managedObjectContext = [notification object];
if(managedObjectContext != self.managedObjectContext)
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
這樣,保存在生產者線程對象會自動在你的消費者的線頭。
核心數據通常不是線程安全的。我的首選是在後臺線程上做最少的工作,並且一旦從Web服務中檢索到它,將創建Core Data實體所需的數據傳遞給主線程。但是,請看this document。如果需要,有一些跨線程使用核心數據的策略。
「核心數據通常不是線程安全的」頗具誤導性。如果爲每個線程創建一個上下文(或每個操作;上下文非常輕量級),則其餘的Core Data框架將處理幾乎所有其他事情(您只需處理NSManagedObjectContextDidSaveNotifications,如上所述)。 – hatfinch 2010-03-22 20:41:00
我同意,這是非常誤導。 – JHollanti 2012-03-04 07:46:27