如何确保从上下文而不是缓存中获取 Core Data Fetched Property?

Posted

技术标签:

【中文标题】如何确保从上下文而不是缓存中获取 Core Data Fetched Property?【英文标题】:How do ensure that a Core Data Fetched Property is fetched from the context rather than the cache? 【发布时间】:2010-09-23 13:09:00 【问题描述】:

我有一个包含 2 个实体的托管对象模型。

其中一个实体(我们称之为 EA)通过引用第二个实体(称之为 EB)的子集中的一些属性来计算其属性。

EA 中,我设置了一个“Fetched Property”,其中包含一个返回我需要的 EB 对象子集的谓词。

当我删除时,插入 EB 对象或更改 EB 对象我使用通知来确保 EA 保持最新。因此,例如在“保存”之后,EA 对象将重新计算其属性。

我的问题是,当我访问 Fetched 属性时(我在 EB 模型类使用[self valueForKey:FetchedPropertyKeyName]),似乎只提取缓存的版本.换句话说,第一次很好,但是当我添加另一个 EA 对象时,当我访问获取的属性时,我没有在返回的数组中看到它。当我删除一个对象时,这一点最为明显,因为该对象不再存在而导致崩溃。

Fetched Properties 的文档说:

如果目标实体中的对象发生更改,您必须重新评估获取的属性以确保它是最新的。您可以使用 refreshObject:mergeChanges: 手动刷新属性——这会导致在下次触发对象故障时再次执行与该属性关联的获取请求。

对不起,如果这听起来是一个愚蠢的问题,但不幸的是我没有看到我应该打电话给refreshObject:mergeChanges: ??

【问题讨论】:

【参考方案1】:

编写问题的纪律让我再次仔细查看代码,所以我现在有了解决方案!

我补充说:

[[self managedObjectContext] refreshObject:self mergeChanges:YES];

进入观察方法。这会导致发生提取,并且在 awakeFromFetch 方法中我重新评估了我的所有属性,并且提取的属性现在包含预期的新数据。

【讨论】:

以上是关于如何确保从上下文而不是缓存中获取 Core Data Fetched Property?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 servlet 上下文而不是根上下文中获取 bean?

讨论过后而引发对EF 6.x和EF Core查询缓存的思考

讨论过后而引发对EF 6.x和EF Core查询缓存的思考

如何过滤从 Core Data 获取的数据?

如何在 Web 应用程序(ASP.NET Core)中使用 TypeScript 导入语句而不是 <reference path...>?

锁定是不是确保从缓存中刷新读取和写入?如果是这样,怎么做?