NSFetchedResultsController委托方法不为这些更改触发

时间:2012-07-21 23:54:01

标签: objective-c core-data nsfetchedresultscontroller nsfetchrequest

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

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。我已经证实这种情况正在发生。

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

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

我是否设置错误,或者我的期望错了?我该怎么办呢?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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