2009-05-23 27 views
6

我有一個核心數據應用程序。在生產者線程中,我從Web服務中提取數據並將其存儲在我的對象中並調用save。 我的使用者對象是顯示相同的表格視圖控制器。 然而,應用程序崩潰,我得到 NSFetchedResultsController錯誤:希望找到對象(單位:FeedEntry; ID:0xf46f40;數據:)在第(空)刪除核心數據生產者消費者問題

在控制檯上

。當我調試它時,一切正常。所以我明白這就像種族問題。

這些問題如何解決?使用核心數據設計生產者 - 消費者應用程序的最佳方式是什麼?

回答

16

如果您的目標是Leopard或更高版本,Apple已經讓事情變得更輕鬆。

在您的生產者線程中,創建一個與主線程中的MOC具有相同PSC的MOC。您可以在此線程中從您的web服務中提取對象,創建新對象並將其保存爲正常。

在您的消費者線程中,將您的控制器添加爲NSManagedObjectContextDidSaveNotification的觀察者。你的回調應該是這個樣子:

- (void) managedObjectContextDidSave:(NSNotification *)notification 
{ 
    NSManagedObjectContext *managedObjectContext = [notification object]; 
    if(managedObjectContext != self.managedObjectContext) 
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
} 

這樣,保存在生產者線程對象會自動在你的消費者的線頭。

0

核心數據通常不是線程安全的。我的首選是在後臺線程上做最少的工作,並且一旦從Web服務中檢索到它,將創建Core Data實體所需的數據傳遞給主線程。但是,請看this document。如果需要,有一些跨線程使用核心數據的策略。

+0

「核心數據通常不是線程安全的」頗具誤導性。如果爲每個線程創建一個上下文(或每個操作;上下文非常輕量級),則其餘的Core Data框架將處理幾乎所有其他事情(您只需處理NSManagedObjectContextDidSaveNotifications,如上所述)。 – hatfinch 2010-03-22 20:41:00

+0

我同意,這是非常誤導。 – JHollanti 2012-03-04 07:46:27