Ios 如何使用NSFetchResultsController正确处理context.rollback()
我有一个NSFetchResultsController,它为UITableView提供数据。我在导航栏中有一个add按钮,允许用户在下一个视图中添加新实体 在下一个视图中,我创建了一个新实体并将其插入到上下文中。然后,用户可以保存此更改。但是,如果用户决定不保留这个新实体,他们可以点击cancel,然后我调用Ios 如何使用NSFetchResultsController正确处理context.rollback(),ios,swift,uitableview,nsfetchedresultscontroller,Ios,Swift,Uitableview,Nsfetchedresultscontroller,我有一个NSFetchResultsController,它为UITableView提供数据。我在导航栏中有一个add按钮,允许用户在下一个视图中添加新实体 在下一个视图中,我创建了一个新实体并将其插入到上下文中。然后,用户可以保存此更改。但是,如果用户决定不保留这个新实体,他们可以点击cancel,然后我调用context.rollback()来删除这个新实体。这会导致我的fetchresultscontroller引发异常: 由于未捕获异常“NSInternalInconsistencyEx
context.rollback()
来删除这个新实体。这会导致我的fetchresultscontroller引发异常:
由于未捕获异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:节0中的行数无效。”。更新(2)后现有节中包含的行数必须等于更新(2)前该节中包含的行数,加上或减去从该节中插入或删除的行数(0插入,1删除),加上或减去移入或移出该节的行数(0移入,0移出).
这是当我有两个实体,创建第三个实体并点击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没有检测到新实体的插入,而是在我执行回滚时检测到它的删除?是因为插入和删除都是在同一个实体上执行的吗?我意识到我在原来的VC中已经实现了一个
didChangeObject
fetchResultControllerDelegate方法,这就是罪魁祸首。线路
templatesTable.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
当另一个VC调用context.rollback()
所以我解决了这个问题,在我的第一个VC中添加了一个boolinAnother
。最初我将其设置为false。当我切换到另一个视图时,我将其设置为true。然后,当回滚发生在另一个视图中时,调用我的fetchController的didChangeObject
。在didChangeObject
中,我检查我是否在另一个视图中,如果我在:
if (!inAnother && type == NSFetchedResultsChangeType.Delete) {
templatesTable.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
}
另外,我在我的第一个VC的viewwillbeen()
中将InOther设置回false,以确保行删除继续正常工作