NSFetchedResultsController 具有基于依赖属性的谓词

Ale*_*lex 5 iphone cocoa cocoa-touch core-data

我有一个 Core Data iPhone 应用程序,可以显示Subscription其中任何items不存在的实体read。换句话说,我构建了一个这样的谓词:

[NSPredicate predicateWithFormat:@"ANY items.read == NO"]
Run Code Online (Sandbox Code Playgroud)

Subscription虽然这适用于初始获取,但当我修改 时它不会影响实体Item,因此NSFetchedResultsController永远不会重新评估Subscription实体。什么是更好的构造方法,以便在设置Subscription项目的属性时更新实体?read

我确实尝试unreadCount在 上创建一个属性Subscription并使用keyPathsForValuesAffectingUnreadCount它返回包含items.read. 我没想到这会起作用,而且没有。我收到一个异常,_NSFaultingMutableSet告诉我该read密钥不受支持。

ger*_*ry3 2

我看到两个解决方案:

  1. 当您修改项目时,让获取结果控制器再次执行获取并重新加载表视图。
  2. 向订阅添加一个属性(例如您的 unreadCount 或布尔值 h​​asUnreadItems)并保持其正确更新。在获取结果控制器中使用此属性。

您可以获取名为“aSubscription”的订阅的未读项目集,如下所示:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"read == NO"];
NSSet *unreadItems = [aSubscription.items filteredSetUsingPredicate:pred];
Run Code Online (Sandbox Code Playgroud)

  • 您是将属性添加到子类中还是实际上将属性放入模型中的核心数据实体中?听起来你只是把它放在子类中,正如你所看到的,它工作得不太好。gerry3 的建议是向模型本身的实体添加一个属性并保持更新。 (2认同)