NSFetchedResultsController对更新没有反应

时间:2011-02-22 16:23:34

标签: core-data

您好 今天我遇到了一个非常奇怪的NSFetchedResultsController行为,我用它来填充UITableView和核心数据记录: 我在Core Data模型中有两个实体:ParentChild。每个实体都具有Int16属性typeNumber和字符串属性nameParent与被称为Child的{​​{1}}有许多关系。 NSFetchchedResultsController的NSFetchRequest选择children实体,按谓词Child排序name。看起来很简单。

在NSFetchedResultsController执行提取之前,CoreData中有以下结构:一个[NSPredicate predicateWithFormat:@"parent.typeNumber == 1"] Parent名为typeNumber = 1,其中包含两个子项:parent1(名称){{1} }和child1typeNumber = 1。所以在child2之后它会显示那两个typeNumber = 2和`child2。到目前为止一切都很好。

但随后触发了以下操作:新的performFetch对象被添加到同名child1Parent名为NSManagedObjectContext且有两个孩子:typeNumber = 1 parent2child3 typeNumber = 1 child4。这会两次触发typeNumber = 2协议的controller: didChangeObject: atIndexPath: forChangeType: newIndexPath:选择器。现在我在UITableView中看到所有4个孩子。确定。

然后我使用以下代码将NSFetchedResultsControllerDelegate更改为parent1.typeNumber2。但没有parent1.typeNumber = [NSNumber numberWithInt:2];选择器被解雇!怎么样?现在NSFetchedResultsControllerDelegatechild1child2 fetchRequest不匹配,对吗?为什么NSFetchedResultsController没有对此作出反应?我认为它以某种方式知道CoreData使用的NSManagedObject子类的属性何时发生了变化。

1 个答案:

答案 0 :(得分:0)

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

parent1.typeNumber = [NSNumber numberWithInt:2];

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

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

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