Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用NSFetchResultsController正确处理context.rollback()_Ios_Swift_Uitableview_Nsfetchedresultscontroller - Fatal编程技术网

Ios 如何使用NSFetchResultsController正确处理context.rollback()

Ios 如何使用NSFetchResultsController正确处理context.rollback(),ios,swift,uitableview,nsfetchedresultscontroller,Ios,Swift,Uitableview,Nsfetchedresultscontroller,我有一个NSFetchResultsController,它为UITableView提供数据。我在导航栏中有一个add按钮,允许用户在下一个视图中添加新实体 在下一个视图中,我创建了一个新实体并将其插入到上下文中。然后,用户可以保存此更改。但是,如果用户决定不保留这个新实体,他们可以点击cancel,然后我调用context.rollback()来删除这个新实体。这会导致我的fetchresultscontroller引发异常: 由于未捕获异常“NSInternalInconsistencyEx

我有一个NSFetchResultsController,它为UITableView提供数据。我在导航栏中有一个add按钮,允许用户在下一个视图中添加新实体

在下一个视图中,我创建了一个新实体并将其插入到上下文中。然后,用户可以保存此更改。但是,如果用户决定不保留这个新实体,他们可以点击cancel,然后我调用
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中添加了一个bool
inAnother
。最初我将其设置为false。当我切换到另一个视图时,我将其设置为true。然后,当回滚发生在另一个视图中时,调用我的fetchController的
didChangeObject
。在
didChangeObject
中,我检查我是否在另一个视图中,如果我在:

if (!inAnother && type == NSFetchedResultsChangeType.Delete) {

        templatesTable.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)

}
另外,我在我的第一个VC的
viewwillbeen()
中将InOther设置回false,以确保行删除继续正常工作