我有一个NSFetchResultsController,它为UITableView提供数据。我在导航栏中有一个add按钮,允许用户在下一个视图中添加一个新实体。
在下一个视图中,我创建一个新实体并将其插入上下文中。然后,用户可以保存此更改。但是,如果用户决定不保留这个新实体,他们可以单击cancel,然后我调用context.rollback()来处理新实体。这导致我的获取结果控制器抛出一个异常:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (2) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).
这是当我有两个实体并创建第三个实体并单击cancel时所显示的错误。
当我在另一个视图上执行回滚时,异常将被抛出。我使用以下代码执行插入:
let entity = NSEntityDescription.entityForName("template",
inManagedObjectContext: context!)
let newTemplate = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: context) as! Template
newWorkoutTemplate.setValue("New Template", forKey: "name")
self.template = newWTemplate在执行此插入之前,我设置上下文的撤消管理器。为什么NSFetchResultsController不检测新实体的插入,而是在我执行回滚时检测它的删除?是因为插入和删除都是在同一个实体上执行的吗?
发布于 2015-07-14 15:32:21
我意识到我已经在我原来的VC中实现了一个didChangeObject fetchResultControllerDelegate方法,这就是罪魁祸首。线
templatesTable.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)被调用时,另一个VC调用了context.rollback()
因此,我通过在我的第一个VC中添加一个bool inAnother来解决这个问题。一开始我把它设为假的。当我转到另一个视图时,我把它设为真。然后,当回滚发生在另一个视图中时,将调用获取控制器的didChangeObject。在didChangeObject中,我检查我是否在另一个视图中,如果我是,则什么也不做:
if (!inAnother && type == NSFetchedResultsChangeType.Delete) {
templatesTable.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
}此外,我在第一个VC的inAnother中将viewWillAppear()设置为false,以确保行删除继续正常运行。
https://stackoverflow.com/questions/31406743
复制相似问题