核心数据和 NSFetchedResultsController:忽略 controllerDidChangeContent 中的字段

Posted

技术标签:

【中文标题】核心数据和 NSFetchedResultsController:忽略 controllerDidChangeContent 中的字段【英文标题】:Core Data & NSFetchedResultsController: ignoring fields in controllerDidChangeContent 【发布时间】:2014-09-25 16:12:44 【问题描述】:

我有一个后台线程,它执行后台更新、设置/覆盖几种 NSManagedObjects 上的字段。所有子类都包含一个 lastModified 属性,该属性在被后台任务处理时总是得到更新。

我的问题是,当我这样做的时候,所有被后台线程命中的实体也会触发controllerWillChangeContent/controllerDidChangeContent。即使什么都没有真正改变。

如果我点击了一个 setter(例如,使用一个 NSString 但内容实际上并没有改变,它是否仍会触发更新,或者 CoreDate 是否聪明到可以忽略这一点?

是否可以在通知 resultsControllers 更改时以某种方式将属性标记为不包括在内?

【问题讨论】:

【参考方案1】:

您可以使用setPrimitiveValue:forKey: 更改 NSManagedObject 而无需发送任何 KVO 通知(这会触发 nsfetchedresultscontroller 更新)

例如

[self setPrimitiveValue:[NSDate date] forKey:@"lastModified"]

您可以在此处阅读有关这些内容的更多信息 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/TP40002154-SW5

【讨论】:

我试过这个,但似乎setPrimitiveValue 也阻止了值被持久化? 我的意思是 resultsControllers 没有收到关于 lastModified 更改的通知,或者也许有一种区分更新的方法,所以我可以过滤掉不重要的更改。这样我就可以防止每个单元格都被更新。 setPrimitiveValue 如果您保存它的 managedobjectcontext 应该仍然保留值。我将使用这个 setprimitivevalue 创建一个特殊的 setter 方法,后台线程使用它来进行更新而不触发 KVO。 听起来不错,这似乎有效:)。值得注意的是,您似乎需要在设置后保存上下文。否则,连续查询似乎表现得很奇怪(它们可能没有更新的值)。另一种选择(但有点奇怪)是将属性移动到另一个实体,以便控制器不会将其视为对实体的更改。

以上是关于核心数据和 NSFetchedResultsController:忽略 controllerDidChangeContent 中的字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 MKMapView、核心位置和核心数据

具有核心数据和非核心数据源的 UITableView

核心数据和图像缓存

核心数据 NSFetchedResultsController 和排序

核心数据和分页

NSDictionary 和核心数据