首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用一个context.rollback()正确处理context.rollback()

如何使用一个context.rollback()正确处理context.rollback()
EN

Stack Overflow用户
提问于 2015-07-14 12:35:19
回答 1查看 89关注 0票数 2

我有一个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时所显示的错误。

当我在另一个视图上执行回滚时,异常将被抛出。我使用以下代码执行插入:

代码语言:javascript
复制
 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不检测新实体的插入,而是在我执行回滚时检测它的删除?是因为插入和删除都是在同一个实体上执行的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-14 15:32:21

我意识到我已经在我原来的VC中实现了一个didChangeObject fetchResultControllerDelegate方法,这就是罪魁祸首。线

代码语言:javascript
复制
            templatesTable.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)

被调用时,另一个VC调用了context.rollback()

因此,我通过在我的第一个VC中添加一个bool inAnother来解决这个问题。一开始我把它设为假的。当我转到另一个视图时,我把它设为真。然后,当回滚发生在另一个视图中时,将调用获取控制器的didChangeObject。在didChangeObject中,我检查我是否在另一个视图中,如果我是,则什么也不做:

代码语言:javascript
复制
if (!inAnother && type == NSFetchedResultsChangeType.Delete) {

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

}

此外,我在第一个VC的inAnother中将viewWillAppear()设置为false,以确保行删除继续正常运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31406743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档