核心数据上下文“脏”:MOC 保存崩溃应用
Posted
技术标签:
【中文标题】核心数据上下文“脏”:MOC 保存崩溃应用【英文标题】:Core Data Context "dirty": MOC save crashes app 【发布时间】:2010-02-10 04:11:57 【问题描述】:对 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 或通知处理程序引起的。与 userInfo (null)
2010-02-09 23:02:03.931 app2[26664:207] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“在保存之前无法处理挂起的更改。 100 次尝试后上下文仍然很脏。通常,这种递归污染是由错误的验证方法、-willSave 或通知处理程序引起的。'
我的研究得出了一些非常有限的结果——幸好我在这里可以记录下来,是吗? :-) 但是我的直觉是 MOC 正在我的控制器中的其他地方被写入,尽管我找不到发生这种情况的证据。 viewDidLoad 方法有 NSFetchedResultsController 用于获取初始数据,仅此而已。
对这里可能出现的问题有什么建议吗?像往常一样,非常感谢您基于社区的蜂巢思维!
干杯,亚伦
【问题讨论】:
【参考方案1】:(如果我正确理解问题) 我认为在这种情况下您需要做的就是:
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 中删除它。
希望这会有所帮助!
【讨论】:
感谢你们俩。 Marcus,您关于由于 MOC 保存而调用委托方法的注释对我来说真的很具体。我应该去买你的书什么的……:-)以上是关于核心数据上下文“脏”:MOC 保存崩溃应用的主要内容,如果未能解决你的问题,请参考以下文章
应用程序设计:处理带有背景上下文的核心数据;合并由 MOC 过滤的通知