更新到 NSManagedObject 会导致 NSFetchedResultsController 删除

Posted

技术标签:

【中文标题】更新到 NSManagedObject 会导致 NSFetchedResultsController 删除【英文标题】:Update to NSManagedObject causes NSFetchedResultsController delete 【发布时间】:2011-04-24 04:25:19 【问题描述】:

我有一个非常令人沮丧的问题,我已经苦苦挣扎了很长一段时间。

为了提供一些上下文和细节,我有一个 ios UISplitViewController 应用程序 - 标准的主/细节东西。主视图是一个带有 NSFetchedResultsController(从 SQLite 数据存储加载 NSManagedObjects)支持的 UITableView。

似乎正在发生的是,详细信息视图中的任何更新(通常会导致更新“主记录”并刷新到 NSManagedObject 并最终刷新到 SQL 数据存储)会导致 NSFetchedResultsController 上的 DELETE 操作。

我认为这是因为对 NSManagedObject 属性的写入导致某种错误,进而导致 NSFetchedResultsController 将其从缓存的结果集中删除。最终结果是记录从主视图中“丢失”(例如:UITableCellView 已从主 UITableView 中删除)。

问题是我不希望这种情况发生,我不知道如何阻止它......

以前有没有人遇到过这个问题并且可以提供一些指导?

提前致谢, 本

【问题讨论】:

【参考方案1】:

我不确定这是否能回答您的问题,但我找到了解决我遇到的类似问题的方法。我正在按每个对象名称的第一个字母对我的 Core Data 支持的 UITableView 中的对象进行排序。在我阅读的任何教程中,它都告诉我在 NSManagedObject 子类中放置一个瞬态属性“NameInitial”,我将使用该对象名称的第一个字母填充该属性。然后我使用该属性作为我的 sectionNameKeyPath 将对象分类到我的 UITableView 中的适当部分。

我在每个单元格上都有一个按钮,用于更新与该单元格关联的对象的属性,并且我在 didChangeObject 委托函数中正确接收到 NSFetchedResultsChangeUpdate 消息。但是,有时,单元格会被删除,我会无缘无故收到 NSFetchedResultsChangeDelete 消息。

然后我注意到被删除的单元格具有 (null) 作为其关联对象的 NameInitial 属性。我忘记了瞬态 NameInitial 只存储在内存中,因此不一定一直维护。一旦我每次更新单元格时手动重新填充 NameInitial 属性,删除就会停止。因此,如果您使用瞬态属性来帮助对 UITableView 进行排序/分段,这可能是您的问题。

希望这会有所帮助,祝你好运! -瑞克

【讨论】:

以上是关于更新到 NSManagedObject 会导致 NSFetchedResultsController 删除的主要内容,如果未能解决你的问题,请参考以下文章

从数据模型更新 NSManagedObject 类定义

xCode 8 会自动更新 NSManagedObject,是吗?

创建 NSManagedObject 子类导致链接器错误重复符号

合并具有相同属性但 ID 不同的 NSManagedObject,与 iCloud 同步会导致重复(Core Data,Swift 1.2)

核心数据-后台线程中的更新实体会自动更改主线程中的 NSManagedObject 而无需合并-为啥?

NSManagedObjectContext 保存导致 NSTextField 失去焦点