NSFetchedResultsController 对更新没有反应
Posted
技术标签:
【中文标题】NSFetchedResultsController 对更新没有反应【英文标题】:NSFetchedResultsController does not react on update 【发布时间】:2011-02-22 16:23:34 【问题描述】:今天我遇到了 NSFetchedResultsController 的一个非常奇怪的行为,我用它来用 Core Data 记录填充 UITableView。
我在 Core Data 模型中有两个实体:Parent
和 Child
。每个实体都有 Int16 属性typeNumber
和字符串属性name
。 Parent
与 Child
有一对多关系,称为 children
。
NSFetchedResultsController 的 NSFetchRequest 选择按 name
排序的 Child
实体,谓词 [NSPredicate predicateWithFormat:@"parent.typeNumber == 1"]
。看起来很简单。
在 NSFetchedResultsController 执行 fetch 之前,CoreData 中有以下结构:一个 Parent
和 typeNumber = 1
命名为 parent1
和两个孩子:child1
(名称)和 typeNumber = 1
和 child2
和 typeNumber = 2
。所以就在performFetch
之后,它显示了这两个child1
和`child2。到目前为止一切顺利。
但随后会触发以下操作:将新的 Parent
对象添加到同一个 NSManagedObjectContext
和名为 typeNumber = 1
的 parent2
和两个孩子:child3
和 typeNumber = 1
和 child4
和 @987654348 @。这会触发NSFetchedResultsControllerDelegate
协议的controller: didChangeObject: atIndexPath: forChangeType: newIndexPath:
选择器两次。现在我在 UITableView 中看到所有 4 个孩子。好的。
然后我将parent1.typeNumber
更改为2
,代码如下:parent1.typeNumber = [NSNumber numberWithInt:2];
。但是没有NSFetchedResultsControllerDelegate
selectors 被解雇!怎么样?现在child1
和child2
不会匹配NSFetchedResultsController
fetchRequest,对吧?为什么NSFetchedResultsController
对此没有反应?我认为它以某种方式知道 CoreData 使用的 NSManagedObject 子类的属性何时更改。
【问题讨论】:
一个测试项目的来源是here 我实际上知道解决这种情况的方法:只需致电NSFetchedResultsController performFetch
和tableView reloadData
。但很好奇为什么NSFetchedResultsController
没有按预期工作。
【参考方案1】:
您只能使用访问表单,例如
parent1.typeNumber = [NSNumber numberWithInt:2];
...如果您创建了 NSManagedObject 的自定义Parent
子类并将parent1
对象实例化为该子类。否则,parent1
只是一个通用的 NSManagedObject,您必须使用键值编码进行更改:
[parent1 setValue:[NSNumber numberWithInt:2] forKey:@"typeNumber];
如果您不使用正确的访问表单,则实际上永远不会进行更改,因此控制器永远不会向其委托发送更改消息。
【讨论】:
是的,当然Child
和Parent
类都继承自NSManagedObject。我刚刚在 XCode 中使用了从 xcdatamodel 自动生成类。以上是关于NSFetchedResultsController 对更新没有反应的主要内容,如果未能解决你的问题,请参考以下文章