您好
今天我遇到了一个非常奇怪的NSFetchedResultsController行为,我用它来填充UITableView和核心数据记录:
我在Core Data模型中有两个实体:Parent
和Child
。每个实体都具有Int16属性typeNumber
和字符串属性name
。 Parent
与被称为Child
的{{1}}有许多关系。
NSFetchchedResultsController的NSFetchRequest选择children
实体,按谓词Child
排序name
。看起来很简单。
在NSFetchedResultsController执行提取之前,CoreData中有以下结构:一个[NSPredicate predicateWithFormat:@"parent.typeNumber == 1"]
Parent
名为typeNumber = 1
,其中包含两个子项:parent1
(名称){{1} }和child1
与typeNumber = 1
。所以在child2
之后它会显示那两个typeNumber = 2
和`child2。到目前为止一切都很好。
但随后触发了以下操作:新的performFetch
对象被添加到同名child1
,Parent
名为NSManagedObjectContext
且有两个孩子:typeNumber = 1
parent2
和child3
typeNumber = 1
child4
。这会两次触发typeNumber = 2
协议的controller: didChangeObject: atIndexPath: forChangeType: newIndexPath:
选择器。现在我在UITableView中看到所有4个孩子。确定。
然后我使用以下代码将NSFetchedResultsControllerDelegate
更改为parent1.typeNumber
:2
。但没有parent1.typeNumber = [NSNumber numberWithInt:2];
选择器被解雇!怎么样?现在NSFetchedResultsControllerDelegate
和child1
与child2
fetchRequest不匹配,对吗?为什么NSFetchedResultsController
没有对此作出反应?我认为它以某种方式知道CoreData使用的NSManagedObject子类的属性何时发生了变化。
答案 0 :(得分:0)
您只能使用访问表单,例如
parent1.typeNumber = [NSNumber numberWithInt:2];
...如果您已创建NSManagedObject的自定义Parent
子类并将parent1
对象实例化为该子类。否则,parent1
只是一个通用的NSManagedObject,您必须使用键值编码进行更改:
[parent1 setValue:[NSNumber numberWithInt:2] forKey:@"typeNumber];
如果您没有使用正确的访问表单,则实际上从未进行更改,因此控制器永远不会向其委托发送更改消息。