1

我认为这会工作,但我不知道为什么我做错了。我使用的谓词在下面的代码已取得的成果控制器:NSFetchedResultsController委托方法不为这些更改触发

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

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

+0

是的,这将遵循我描述的行为。有点可笑,但我想这是你可以采取的一种方法。 – gschandler 2012-07-23 05:27:57

2

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

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