NSFetchedResultsController 对更新没有反应

Posted

技术标签:

【中文标题】NSFetchedResultsController 对更新没有反应【英文标题】:NSFetchedResultsController does not react on update 【发布时间】:2011-02-22 16:23:34 【问题描述】:

今天我遇到了 NSFetchedResultsController 的一个非常奇怪的行为,我用它来用 Core Data 记录填充 UITableView。

我在 Core Data 模型中有两个实体:ParentChild。每个实体都有 Int16 属性typeNumber 和字符串属性nameParentChild 有一对多关系,称为 children。 NSFetchedResultsController 的 NSFetchRequest 选择按 name 排序的 Child 实体,谓词 [NSPredicate predicateWithFormat:@"parent.typeNumber == 1"]。看起来很简单。

在 NSFetchedResultsController 执行 fetch 之前,CoreData 中有以下结构:一个 ParenttypeNumber = 1 命名为 parent1 和两个孩子:child1(名称)和 typeNumber = 1child2typeNumber = 2。所以就在performFetch 之后,它显示了这两个child1 和`child2。到目前为止一切顺利。

但随后会触发以下操作:将新的 Parent 对象添加到同一个 NSManagedObjectContext 和名为 typeNumber = 1parent2 和两个孩子:child3typeNumber = 1child4 和 @987654348 @。这会触发NSFetchedResultsControllerDelegate 协议的controller: didChangeObject: atIndexPath: forChangeType: newIndexPath: 选择器两次。现在我在 UITableView 中看到所有 4 个孩子。好的。

然后我将parent1.typeNumber 更改为2,代码如下:parent1.typeNumber = [NSNumber numberWithInt:2];。但是没有NSFetchedResultsControllerDelegateselectors 被解雇!怎么样?现在child1child2 不会匹配NSFetchedResultsController fetchRequest,对吧?为什么NSFetchedResultsController 对此没有反应?我认为它以某种方式知道 CoreData 使用的 NSManagedObject 子类的属性何时更改。

【问题讨论】:

一个测试项目的来源是here 我实际上知道解决这种情况的方法:只需致电NSFetchedResultsController performFetchtableView reloadData。但很好奇为什么NSFetchedResultsController 没有按预期工作。 【参考方案1】:

您只能使用访问表单,例如

parent1.typeNumber = [NSNumber numberWithInt:2];

...如果您创建了 NSManagedObject 的自定义Parent 子类并将parent1 对象实例化为该子类。否则,parent1 只是一个通用的 NSManagedObject,您必须使用键值编码进行更改:

[parent1 setValue:[NSNumber numberWithInt:2] forKey:@"typeNumber];

如果您不使用正确的访问表单,则实际上永远不会进行更改,因此控制器永远不会向其委托发送更改消息。

【讨论】:

是的,当然ChildParent 类都继承自NSManagedObject。我刚刚在 XCode 中使用了从 xcdatamodel 自动生成类。

以上是关于NSFetchedResultsController 对更新没有反应的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?