关系的 NSFetchedResultsController 委托回调

Posted

技术标签:

【中文标题】关系的 NSFetchedResultsController 委托回调【英文标题】:NSFetchedResultsController delegate callback for relationship 【发布时间】:2013-12-11 15:08:50 【问题描述】:

假设你有两个实体,一个是People,另一个是LocationLocation 具有属性 namePeople 与名为 locationLocation 具有一对一关系。

那么如果你有一个像下面这样的NSFetchedResultsController,当你改变Locations name时你不能得到委托回调。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"People"
                                          inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"location.name" 
                                                               ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];

[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = 
   [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                       managedObjectContext:self.managedObjectContext
                                         sectionNameKeyPath:@"location.name" 
                                                  cacheName:@"Master"];

aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

我知道我可以获取Location 实体,然后通过name 对其进行过滤以解决此问题。但我对此很好奇,NSFetchedResultsController 委托是否只会在实体关系发生变化时通知您,而不是关系的属性。

谁能给我一些关于这个功能的帖子。我搜索了网络和 Apple 的文档,但找不到合理的描述。

【问题讨论】:

【参考方案1】:

NSFetchedResultsController 代理是否只是在实体关系发生更改时通知您,而不是关系的属性。

没错。因为关系的变化是 FRC 正在观察的对象的变化。但是,在关系的另一端,其中一个对象的属性发生变化时不会通知委托,因为 FRC 没有观察到这些对象。

【讨论】:

感谢您的编辑。是否有任何帖子更详细地解释了这个主题,我在苹果的文档中找不到任何内容。因为您可以使用@"location.name" 之类的方式对获取结果进行分组,但是如果name 中有任何更改,就会出错。这让新人惊喜。 或者有没有什么书解释过这个功能。我有一本关于 Core Data 的书,给我看一些简单的演示。

以上是关于关系的 NSFetchedResultsController 委托回调的主要内容,如果未能解决你的问题,请参考以下文章

又一个 NSInternalInconsistencyException,但使用 NSFetchedResultsController

Core Data 中计算的持久属性

NSFetchedresultscontroller 与 tableview 插入新部分崩溃

NSFetchedResultsController:具有相同键的两个排序描述符不起作用。一个降序用于部分,另一个升序用于行

集合论:关系

对象关系之聚合关系