代码之家  ›  专栏  ›  技术社区  ›  Leon

NSFetchedResultsController和childController

  •  0
  • Leon  · 技术社区  · 14 年前

    RootViewController 我向核心数据存储执行一个提取请求(?)它返回一组,比如说,食谱。当用户在rootviewcontroller中选择配方时,我执行pushViewController并将其中一个配方推送到childcontroller。

    在childController中,用户可以刷新“配方”,以便更新配料等。当用户选择“刷新”时,我连接到interwebs以接收新数据。我把这些新数据输入self.recipe.materials。

    这一切都很好。但我想重新加载chilController视图。所有的刷新工作都是在后台完成的,所以我想在核心数据工作完成时发出一个信号。

    因此,当我在rootViewController中创建controllerIDChangeContent方法时,我看到它被触发了。但现在的问题是:如何更新childViewController的tableview?

    我想在rootViewControllers的controllerIDChangeContent方法中调用此方法: [self.childController控制器idChangeContent:控制器] 所以就把开火的方法传下去

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

    那两个人中哪一个最好?或者还有其他我没想到的可能性吗?

    1 回复  |  直到 14 年前
        1
  •  0
  •   dnorcott    14 年前

    我在我的一个项目中用一种稍微不同的方式解决了这个问题。我让子控制器创建并使用它自己的NSFetchRequest。它工作得很好,但我很想知道是否有人推荐不同的方法。

    因此,使用you应用程序的术语,这里是:在childController中,我使用配料实体创建了一个全新的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协议。