NSFetchedResultsController 委托方法未针对这些更改触发

Posted

技术标签:

【中文标题】NSFetchedResultsController 委托方法未针对这些更改触发【英文标题】:NSFetchedResultsController delegate methods not firing for these changes 【发布时间】:2012-07-21 23:54:01 【问题描述】:

我认为这会起作用,但我不确定我为什么做错了。我有一个使用以下代码中的谓词获取的结果控制器:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"SearchResult" inManagedObjectContext:[[DataInterfaceObject sharedAlloc] managedObjectContext]];    
[fetchRequest setEntity:entity];    
[fetchRequest setFetchBatchSize:10];

// Results Table predicate
NSPredicate *predicate_Results = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: [ResultsTableVC resultsPredicate], [NSPredicate predicateWithFormat:@"searchUsed.isCollapsedView == NO"], nil]];

// Favorites Table predicate
NSPredicate *predicate_Favorites = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: [FavoritesTableVC favoritesPredicate], [NSPredicate predicateWithFormat:@"favoritesInfoLink.isCollapsedView == NO"], nil]];

// Full predicate
NSPredicate *predicate = 
[NSCompoundPredicate orPredicateWithSubpredicates: [NSArray arrayWithObjects: 
                                                    predicate_Results, predicate_Favorites, nil]];

[NSFetchedResultsController deleteCacheWithName:@"resultsCache"];
[fetchRequest setPredicate:predicate];

目的是获取与谓词匹配的所有SearchResult 实体。 SearchResult 实体具有如下searchUsed 关系:SearchResult SearchTerms。 SearchTerms 有一个属性isCollapsedView

用户可以点击一个视图并导致相应的对象视图折叠,此时searchUsed.isCollapsedView的值被更新并保存到moc。我已经证实这正在发生。

我希望获取的结果控制器能够识别此更改,然后委托方法会触发,但它们不会。

在插入、删除或更新搜索实体时会触发委托方法。

是我设置错了,还是我的期望错了?我该怎么办?

【问题讨论】:

【参考方案1】:

你的期望是错误的。它只会在 SearchResult 实体的属性或关系发生更改时触发,而不会在 relationsattributes 更改时触发。

如果您要对数据进行非规范化,并将折叠状态布尔值(或使用位字段等)拉入您的 SearchResult 模型,那么您将获得委托调用的好处。

【讨论】:

【参考方案2】:

我发现只需触摸entity 赋值中提到的类型的实体的属性就足够了。然后实体被 moc 标识为更改/更新。显然,此时 frc 会将谓词(包括关系)应用于那些更改的实体,以确定是否存在插入、删除或更新。 (通过触摸,我的意思是只分配一个与现有值相同的值,然后将其保存到 mod。)这样做可以避免添加已经在关系实体中捕获的属性。

【讨论】:

是的,这将遵循我描述的行为。有点笨拙,但我想这是您可以采用的方法。

以上是关于NSFetchedResultsController 委托方法未针对这些更改触发的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?