NSFetchedResultsController和childController

时间:2010-11-07 02:54:03

标签: iphone objective-c

RootViewController中,我对核心数据存储(?)进行了获取请求,并返回一个NSSet,比方说,食谱。当用户在rootviewcontroller中选择配方时,我会执行pushViewController并将其中一个配方推送到子控制器。

在childController中,用户可以刷新“配方”,以便他可以更新配料。当用户选择“刷新”时,我连接到互联网以接收新数据。我把这个新数据放在self.recipe.ingredients。

这一切都很棒。但后来我想重新加载chilController视图。所有令人耳目一新的东西都是在后台完成的,所以我想在核心数据完成时发出信号。

你好NSFetchedResultsController!但要使用NSFetchedResultsController,您需要NSFetchRequest。 NSFetchRequest在我的rootViewController中实例化。

所以当我在rootViewController中创建一个controllerDidChangeContent方法时,我发现它被触发了。但现在的问题是:如何更新childViewController的tableview?

我想过在rootViewControllers的controllerDidChangeContent方法中调用这个方法: [self.childController controllerDidChangeContent:controller] 所以只传递被解雇的方法

或者在实例化childController时,我还可以将fetchRequest传递给childController,并在childController实例中实例化一个新的NSFetchedResultsController。

这两个中最好的是什么?还是有其他我没有想到的可能性?

提前致谢!

1 个答案:

答案 0 :(得分:0)

我在我的一个项目中解决了这个问题。我有子控制器创建并使用自己的NSFetchRequest。它运作良好,但我很想知道是否有人建议采用不同的方法。

所以使用你的应用程序的条款,这里是:在childController中,我使用Ingredient实体创建了一个全新的NSFetchRequest,并在其上放置一个谓词以查找我的食谱中的所有成分。注意:这假设您有从成分回到食谱的反向关系。

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"recipe == %@", self.recipe];
[fetchRequest setPredicate:predicate];

因此,childController使用此fetchRequest而不是RootViewController中的NSFetchRequest。每当添加,删除或更新成分时,childController现在将获得该消息。只是不要忘记childController需要实现NSFetchedResultsControllerDelegate协议。