0

我有一個使用核心數據的iPhone/iPad應用程序。數據通過各種Web服務調用提供。 我使用輪詢機制來確定每個服務調用彼此獨立的時間,以便使信息保持最新。因此,很可能有多個後臺線程使用多個MOC從這些呼叫處理數據。對於插入和更新,這種方法工作正常。 在試圖實現刪除功能時,我的程序崩潰。它似乎是由於一個線程中的上下文刪除了另一個線程也正在處理的託管對象而導致的,因爲刪除的對象已發生故障。具有多個背景線程的核心數據

我一直在尋找解決方案,但並沒有特別針對任何事情。 刪除應該推到主線程的上下文中嗎?爲了完成所有的處理,在Singleton中維護單個線程和伴隨的MOC如何?

任何幫助/指導將不勝感激。

回答

1

我一直在尋找解決方案,但沒有得到任何特別的東西。

您是否試過蘋果在Core Data Programming Guide中建議的所有內容?沒有看到你的代碼,在我看來,你缺少的是NSManagedObjectContextDidSaveNotification部分。每個線程必須在其他線程上註冊MOC保存。這意味着線程必須都有一個運行循環。

整體而言,這看起來有點亂。我想我會更改體系結構以在主線程上執行所有核心數據更改(而不僅僅是刪除)。

+0

在AppDelegate didFinishLaunchingWithOptions方法中: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changesSaved :) name:NSManagedObjectContextDidSaveNotification object:nil];
這就要求:
- (空)changesSaved:(NSNotification *)注意 { [自performSelectorOnMainThread:@selector(changesSavedOnMainThread :) withObject:注意waitUntilDone:YES]; }
最後,
- (空)changesSavedOnMainThread:(NSNotification *)注意 { \t如果([注對象]!= __managedObjectContext)[__managedObjectContext mergeChangesFromContextDidSaveNotification:note]; } – flizit 2012-03-02 20:57:20

+0

對不起,上面的評論看起來很糟糕。無論如何,我背景這個處理理論上保持主線程儘可能自由。我完全可以調整以瞭解主線程與後臺處理對性能的影響。 – flizit 2012-03-02 20:59:01

2

我發現它有助於併發訪問同一應用程序各部分之間共享的一組數據,以便在實際刪除它們之前使用標記對象作爲廢棄對象。

這使得更容易捕獲過時數據的請求並做出適當的響應。

通常我會有某種數據管理器singleton類來處理所有訪問。該標誌可以是實體的時間戳屬性,標記對象的最後訪問。標記對象的實際刪除發生在沒有其他請求處於隊列中並且對象未被使用一定時間的情況下。

根據數據的類型和數量以及更改的頻率,這種方法可能需要細化。

+0

感謝您的回覆。恐怕我不得不添加很多代碼來管理這種類型的實現,但它聽起來不錯。 – flizit 2012-03-02 21:06:43