Objective-C:在NavigationController中对CoreData进行分层传递

时间:2009-12-21 02:54:56

标签: iphone objective-c iphone-sdk-3.0 iphonecoredatarecipes

我需要一些关于这个问题的指导。我有一个导航控制器,根控制器使用CoreData和NSFetchController。现在,根控制器工作正常。当我单击一个项目时,它应该显示下一个UITable关联上一个根控制器中行的值。

现在,我不确定我应该将什么作为属性传递给下一个UITableViewController。它应该是一个数组,还是应该通过NSFetchedResultsController?在第二部分之后,这将是层次结构中的另一个级别,作为注意事项。

由于 多伦

1 个答案:

答案 0 :(得分:3)

至少有几种选择:

  1. 将对父级视图控制器的托管对象控制器的引用传递给子视图控制器;或者,
  2. 从应用程序委托中获取MOC属性,该属性可供任何视图控制器使用
  3. 有些人更喜欢第二种选择,因为您可以重复使用并将视图控制器重新排列到不同的层次结构中通过断开MOC与父控制器和子控制器的连接,您可以获得更多的设计灵活性。此外,如果您的应用程序需要同时管理多个持久性存储,那么从一个中心点进行访问以生成多个MOC会降低代码复杂性。

    在视图控制器中安装MOC后,您可以在该视图控制器中创建获取的结果控制器,并在自己的线程中应用操作。

    修改

    听起来你在SitePost之间有一对多的关系(即一个网站实体有很多帖子实体)。

    您的“帖子”列表视图控制器可以包含site托管对象,siteID托管对象ID或siteName字符串属性。

    当您按下“帖子”列表VC时,请设置其sitesiteName属性并相应地配置请求谓词。

    例如,您的提取请求的谓词应该包含site.name LIKE '%@'之类的内容,例如:

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(site.name like '%@')", self.site.name]];
    [fetchRequest setPredicate:requestPredicate];
    // ...
    

    或者你可以在managed object IDs上进行比较,这对于独特的比较通常更好:

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(site = %@)", self.siteID]];
    [fetchRequest setPredicate:requestPredicate];
    // ...
    

    在这两种情况下,您都已过滤了Core Data存储,以匹配Post名称或site托管对象ID等同于您的条件的所有site实体。

    执行提取后,这些实体通常位于NSSet*NSArray*中,您可以轻松地将其用作UITableView数据存储,尤其是在使用提取的结果控制器时