iPhone开发方面的新手。我的应用程序使用Core Data,有一次我试图在NSFetchedResultsControllerDelegate方法中保存一些数据:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
我从Apple关于这个主题的文档中得到了大部分内容。删除操作如下所示:
case NSFetchedResultsChangeDelete:
[managedObjectContext deleteObject:anObject];
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"WTF? %@", [error description]);
}
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
现在,当我这样做时,相关对象将在不可避免的崩溃后被删除。所以正确的事情正在发生。但崩溃很有意思:
严重的应用程序错误。在Core Data更改处理期间捕获到异常:在保存之前无法处理挂起的更改。 100次尝试后,上下文仍然很脏。通常,这种递归弄脏是由错误的验证方法,-willSave或通知处理程序引起的。 with userInfo(null)
2010-02-09 23:02:03.931 app2 [26664:207] ***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'在保存之前未能处理挂起的更改。 100次尝试后,上下文仍然很脏。通常,这种递归弄脏是由错误的验证方法-willSave或通知处理程序引起的。'
我的研究发现了一些非常有限的结果 - 我在这里记录这件好事,是吗? :-)但我的直觉是说MOC正在写入我控制器的其他地方,尽管我找不到发生这种情况的证据。 viewDidLoad方法使用NSFetchedResultsController来获取初始数据,但就是这样。
有关此处可能出错的任何建议吗?像往常一样,非常感谢基于社区的蜂巢头脑!
干杯,亚伦
答案 0 :(得分: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中删除它。
希望这有帮助!