Iphone 目标C:NavigationController中CoreData的分层传递

Iphone 目标C:NavigationController中CoreData的分层传递,iphone,objective-c,iphone-sdk-3.0,iphonecoredatarecipes,Iphone,Objective C,Iphone Sdk 3.0,Iphonecoredatarecipes,我需要一些关于这个问题的指导。我有一个导航控制器,根控制器使用CoreData和NSFetchController。现在,根控制器工作正常。当我单击一个项目时,它应该分层显示下一个UITable,该UITable关联上一个根控制器中的行的值 现在,我不确定应该将什么作为属性传递给下一个UITableViewController。它应该是一个数组,还是应该传递NSFetchedResultsController?值得注意的是,在第二层之后,层次结构中将有另一层 谢谢 多伦你至少有两个选择: 将对托

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

现在,我不确定应该将什么作为属性传递给下一个UITableViewController。它应该是一个数组,还是应该传递NSFetchedResultsController?值得注意的是,在第二层之后,层次结构中将有另一层

谢谢
多伦

你至少有两个选择:

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

    一旦MOC在其视图控制器中,您就可以在该视图控制器中创建获取的结果控制器,并在它们自己的线程中应用操作

    编辑

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

    “Posts”列表视图控制器可以包括
    site
    托管对象、
    siteID
    托管对象ID或
    siteName
    字符串属性

    当您按下“Posts”列表VC时,设置其
    site
    siteName
    属性,并相应地配置请求谓词

    例如,fetch请求的谓词应包含类似“%@”的site.name,例如:

    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];
    // ...
    
    或者您可以在上进行比较,这通常更适合于唯一比较:

    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];
    // ...
    
    在这两种情况下,您都筛选了核心数据存储,以匹配所有
    Post
    实体,这些实体的
    站点
    名称或
    站点
    托管对象ID与您的条件相同


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

    您有两个选项,至少:

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

    一旦MOC在其视图控制器中,您就可以在该视图控制器中创建获取的结果控制器,并在它们自己的线程中应用操作

    编辑

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

    “Posts”列表视图控制器可以包括
    site
    托管对象、
    siteID
    托管对象ID或
    siteName
    字符串属性

    当您按下“Posts”列表VC时,设置其
    site
    siteName
    属性,并相应地配置请求谓词

    例如,fetch请求的谓词应包含类似“%@”的site.name,例如:

    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];
    // ...
    
    或者您可以在上进行比较,这通常更适合于唯一比较:

    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];
    // ...
    
    在这两种情况下,您都筛选了核心数据存储,以匹配所有
    Post
    实体,这些实体的
    站点
    名称或
    站点
    托管对象ID与您的条件相同


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

    谢谢Alex,我尝试过这样做,当我使用AppController时,我在控制器之间传递MOC和其他东西。通过这种方法(创建一个新的fetchrequest),我不确定如何根据以前的结果链接实体(即从Site->Posts,如何做谓词以关联特定的选定站点)。这就是我的意思。谢谢mate还有一件事,mate,请注意,我的模型有一个站点属性,它有一个包含许多帖子的NSSET(这就是为什么我有通过NSArray的想法),但是是的,我不确定我应该实际地走哪条路。您建议使用MOC,但如果我能得到一些关于如何使用它的说明,请根据所选站点进行映射。我目前正在使用MOC,使用NSPredicate*pred=[NSPredicate PREDITEWITHFORMAT:@“(站点=%d)”,i];其中,i是要与之进行比较的站点实体对象。显然%d不是正确的语法,所以如果我使用MOC,我该如何解决这个问题?嗨,伙计,谢谢你的详细回复。现在我实现了你所说的,减去谓词,然后返回行。现在使用您推荐的谓词Site.name它不起作用,因此我使用Post.h中的属性Site sitePosts并使用(PostSite.name,如“%@”),[self.Site.name],但不返回任何行。我认为我的谓词是错的,但不是sur