2

好吧我有一個非常棘手的問題,我花了幾天的時間去了解並知道我不知道如何解決它。防止NSManagedObjectContextDidSaveNotification事件重疊

我有一個CoreData數據庫從不同上下文的不同線程更新。我的問題是,有時NSManagedObjectContextDidSaveNotification事件重疊並創建導致崩潰的基礎的損壞。這裏有一個例子:

Thread     Main           NSFetchResultsController 

Update database 
Save database   NSManagedObjectContextDidSaveNotification1 
         merge           delegate process 1 
                     process 1 done 

Update database 
Save database   NSManagedObjectContextDidSaveNotification2 
         merge           delegate process 2 
                     process 2 done 
Update database 
Save database   NSManagedObjectContextDidSaveNotification3 
         merge           delegate process 3 

Update database 
Save database   NSManagedObjectContextDidSaveNotification4 
         merge   

                     process 3 done 
                     delegate process 4 
                     CRASH 
                     process 4 done 

在這個僞代碼示例過程1和過程2工作沒有問題 但有時候主線程接收重疊的更新事件和 你process4開始process3完成之前讀取數據庫。

有沒有官方的方式來處理? CoreData是否爲這種情況提供了一個解決方案 ,還是我必須使用NSLock?

感謝

+0

你可以發佈處理合並通知的代碼部分嗎?沒有這一點,我不認爲有更多的人能夠推斷出來。正如我在回答中所說的,上下文鎖定持久性商店協調員以序列化訪問,這應該可以防止這些類型的問題。 – paulbailey 2011-02-03 18:08:02

回答

2

的背景下,應鎖定持久存儲協調它們共享,以防止這些問題。

如果進程3和進程4在主線程上運行,那麼4在3結束之前如何啓動?不要忘記,在發佈它們的線程上接收到通知,因此您需要明確執行代碼以合併主線程上的更改(如果我明確指出,請致歉)。

+0

感謝您的評論。我更新了我的問題,因爲我發現這是更復雜的,因爲有一個NSFetchResultsController涉及。不知何故,當NSFetchResultsControllerDelegate正在處理最後一次更新時,數據庫有時會被更新,這會導致問題 – CodeFlakes 2011-02-02 12:39:31