2010-02-10 70 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