1

对 iPhone 开发者来说相当新。我的应用程序使用核心数据,并且有一次我试图在 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;

现在,当我这样做时,有问题的对象将在不可避免的崩溃后被删除。所以一些正确的事情正在发生。不过,这次崩溃很有趣:

严重的应用程序错误。在核心数据更改处理期间捕获到异常:在保存之前无法处理挂起的更改。100 次尝试后上下文仍然很脏。通常,这种递归污染是由错误的验证方法、-willSave 或通知处理程序引起的。与用户信息(空)

2010-02-09 23:02:03.931 app2[26664:207] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“在保存之前无法处理挂起的更改。100 次尝试后上下文仍然很脏。通常,这种递归污染是由错误的验证方法、-willSave 或通知处理程序引起的。

我的研究得出了一些非常有限的结果——好东西我在这里可以记录下来,嗯?:-) 但是我的直觉是 MOC 被写入我控制器的其他地方,尽管我找不到发生这种情况的证据。viewDidLoad 方法使用 NSFetchedResultsController 来获取初始数据,仅此而已。

关于这里可能有什么问题的任何建议?像往常一样,非常感谢您基于社区的蜂巢思维!

干杯,亚伦

4

1 回答 1

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 中删除它。

希望这可以帮助!

于 2010-02-10T04:38:08.873 回答