2011-08-06 43 views
6

每隔一段時間我們會收到「CoreData無法完成錯誤」。我們已經通讀了Apple的文檔,但不清楚允許保留的內容。我們一直非常小心地爲每個線程創建一個上下文等。然而,我們的應用程序正在做的一件事是我們正在NSUrayControllers(通常通過NSArray或NSDictionary)保留NSManagedObjects。我猜想發生了什麼事是對象關係正在改變,我們沒有處理適當的通知。我們如何防止「CoreData無法完成錯誤」?

有沒有人有關於核心數據更好的設計方面的建議?當我們得到錯誤時,我看不到我們實際上從上下文中刪除了任何內容導致錯誤。如果它們保持狀態,是否有必要在我們的UIViewControllers上處理NSManagedObjectContextObjectsDidChangeNotification?任何建議,將不勝感激。

+1

我們有一個視圖沒有被釋放,它們被刪除後引用了NSManagedObjects。很難找到。 – tjg184

回答

5

您可以在覈心數據中註冊更改通知。這將允許您在更改託管對象時更新它們。查看核心數據文檔獲取更多信息。你會感興趣的2種方法來註冊和應對變化:

[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(mergeChanges:) 
               name:NSManagedObjectContextDidSaveNotification 
              object:(your NSManagedObjectContext)]; 

的mergeChanges選擇(你的方法)將調用下面的方法來同步來自其他線程的任何變化。它看起來像這樣:

- (void)mergeChanges:(NSNotification *)notification{ 
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

    // Merge changes into the default context on the main thread 
    [context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
          withObject:notification 
         waitUntilDone:YES]; 
} 
相關問題