【发布时间】: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];。但是没有NSFetchedResultsControllerDelegateselectors 被解雇!怎么样?现在child1 和child2 不会匹配NSFetchedResultsController fetchRequest,对吧?为什么NSFetchedResultsController 对此没有反应?我认为它以某种方式知道 CoreData 使用的 NSManagedObject 子类的属性何时更改。
【问题讨论】:
-
一个测试项目的来源是here
-
我实际上知道解决这种情况的方法:只需致电
NSFetchedResultsController performFetch和tableView reloadData。但很好奇为什么NSFetchedResultsController没有按预期工作。
标签: core-data