我有一个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
密钥。
答案 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)
我看到两个解决方案:
您可以获取名为“aSubscription”的订阅的未读项目集,如下所示:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"read == NO"];
NSSet *unreadItems = [aSubscription.items filteredSetUsingPredicate:pred];
答案 2 :(得分:0)
抱歉,我应该仔细阅读这个问题。
我通过设置NSFetchedResultsController缓存然后在viewDidAppear:
方法中刷新我的UITableView来解决类似情况。我有一个非常小的数据集,并且经常刷新数据没有明显的性能损失。