gpt4 book ai didi

ios - 我如何使用 NSFetchResultsController 正确处理 context.rollback()

转载 作者:搜寻专家 更新时间:2023-11-01 05:40:19 25 4
gpt4 key购买 nike

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

在下一个 View 中,我创建了一个新实体并将其插入到上下文中。然后用户可以保存此更改。但是,如果用户决定不保留这个新实体,他们可以点击取消,然后我调用 context.rollback() 来删除这个新实体。这会导致我的 fetchresultscontroller 抛出异常:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 部分中的行数无效。更新 (2) 后现有部分中包含的行数必须等于更新前该部分中包含的行数 (2),加上或减去从该部分插入或删除的行数(0 插入,1 删除)加上或减去移入或移出该部分的行数 ( 0 人搬入,0 人搬出)。

这是当我有两个实体时显示的错误,我创建了第三个实体并点击取消。

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

 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。当我转到另一个 View 时,我将其设置为 true。然后,当在另一个 View 中发生回滚时,我的 fetchController 的 didChangeObject 被调用。在 didChangeObject 中,我检查我是否在另一个 View 中,如果是,则不执行任何操作:

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

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

}

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

关于ios - 我如何使用 NSFetchResultsController 正确处理 context.rollback(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31406743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com