NSFetchedResultsController,其谓词基于依赖属性

时间:2010-02-02 16:27:33

标签: iphone cocoa cocoa-touch core-data

我有一个Core Data iPhone应用,可以显示Subscription个实体items不是read的实体。换句话说,我构造一个这样的谓词:

[NSPredicate predicateWithFormat:@"ANY items.read == NO"]

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

我尝试在unreadCount上创建一个属性Subscription,并使用keyPathsForValuesAffectingUnreadCount返回包含items.read的集合。我没想到这会起作用,但事实并非如此。我从_NSFaultingMutableSet获得了一个例外,告诉我不支持read密钥。

3 个答案:

答案 0 :(得分:3)

您遇到了NSFetchedResultsController的错误,其中未收到(或评估?)相关实体的属性更改通知。

在这种情况下,read的{​​{1}}属性未被“监视”更改。

您可以通过伪造关系中items的更改来解决问题,而不是重新构建。即当您更改item时,也会假装更改item.read

我的经历只有一对一的关系。当你只改变其中一个中的一个键时,我不清楚如何处理你的一对多关系。这可能有效:

item

应发送通知,告知thisItem.read = [NSNumber numberWithBool:NO]; [thisItem.subscription willChangeValueForKey:@"items"]; [thisItem.subscription didChangeValueForKey:@"items"]; 正在观看的subscription.items个对象的关系(subscriptions)正在发生变化。

我可以提供一个完美的一对一关系案例的工作示例。

答案 1 :(得分:2)

我看到两个解决方案:

  1. 修改项目时,获取的结果控制器会再次执行提取并重新加载表格视图。
  2. 向Subscription添加属性(例如unreadCount或boolean hasUnreadItems)并保持其正确更新。在获取的结果控制器中使用此属性。
  3. 您可以获取名为“aSubscription”的订阅的未读项目集,如下所示:

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"read == NO"];
    NSSet *unreadItems = [aSubscription.items filteredSetUsingPredicate:pred];
    

答案 2 :(得分:0)

抱歉,我应该仔细阅读这个问题。

我通过设置NSFetchedResultsController缓存然后在viewDidAppear:方法中刷新我的UITableView来解决类似情况。我有一个非常小的数据集,并且经常刷新数据没有明显的性能损失。