2010-02-10 73 views
1

相當新的iPhone開發。我的應用程序使用的核心數據,並在一個點上,我試圖在NSFetchedResultsControllerDelegate方法過程中保存一些數據:核心數據上下文「髒」:MOC保存崩潰應用

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
    atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
    newIndexPath:(NSIndexPath *)newIndexPath { 

我得到這個最右出蘋果對這個問題的文件。刪除動作看起來就像這樣:

case NSFetchedResultsChangeDelete: 
     [managedObjectContext deleteObject:anObject]; 
     NSError *error; 
     if (![managedObjectContext save:&error]) { 
      NSLog(@"WTF? %@", [error description]); 
     } 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

現在,當我這樣做,有問題的對象將必然崩潰之後被刪除。所以正確的事情正在發生。雖然這次崩潰很有趣:

嚴重的應用程序錯誤。核心數據更改處理期間發生異常:在保存之前未能處理掛起的更改。 100次嘗試後,上下文仍然很髒。通常,這種遞歸污染是由錯誤的驗證方法-willSave或通知處理程序引起的。與userInfo(null)

2010-02-09 23:02:03.931 app2 [26664:207] ***終止應用程序由於未捕獲的異常'NSInternalInconsistencyException',原因:'未能在保存前處理掛起的更改。 100次嘗試後,上下文仍然很髒。通常,這種遞歸污染是由錯誤的驗證方法--willSave或通知處理程序造成的。

我的研究發現了一些非常有限的結果 - 我在這裏記錄這件事的好東西,呃? :-)但是我的直覺是說MOC正在寫給我的控制器的其他地方,儘管我找不到這種情況的證據。 viewDidLoad方法使用NSFetchedResultsController來獲取初始數據,但就是這樣。

有什麼建議可能是錯誤的地方?像往常一樣,你的基於社區的蜂巢頭腦非常感謝!

歡呼聲,阿隆

回答

3

(如果我理解正確的問題) 我認爲,所有你需要在這種情況下,做的是:

case NSFetchedResultsChangeDelete: 

     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

請記住,方法

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 

是基礎數據發生變化後通知您。所以我相信你的對象已經被刪除了,你不需要手動刪除它。所有剩下的工作就是將它從tableView中刪除。

希望這會有所幫助!

+1

感謝你們倆。馬庫斯,你關於委託方法被稱爲MOC保存的結果的說明確實爲我明確了它。我應該去買你的書或其他東西...... :-) – 2010-02-11 02:25:19