至少你有几个选择:
- 将托管对象控制器的引用从父视图控制器传递到子视图控制器;或者,
- 使 MOC 属性可从应用委托中使用,任何视图控制器都可以使用该属性
有些人更喜欢第二种选择,因为您可以重用视图控制器并将其重新排列到不同的层次结构中。通过断开 MOC 与父控制器和子控制器的连接,您可以获得更多的设计灵活性。此外,如果您的应用程序需要同时管理多个持久性存储,那么从一个中心点访问以创建多个 MOC 可以降低代码复杂性。
在其视图控制器中拥有 MOC 后,您可以在该视图控制器中创建获取的结果控制器并在它们自己的线程中应用操作。
编辑
听起来Site 和Post 之间存在一对多的关系(即一个站点实体有许多帖子实体)。
您的“帖子”列表视图控制器可以包含 site 托管对象、siteID 托管对象 ID 或 siteName 字符串属性。
推送“帖子”列表VC时,设置其site或siteName属性并相应配置请求谓词。
例如,您的 fetch 请求的谓词应包含 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 与您的条件等效的实体。
执行提取后,这些实体通常驻留在NSSet* 或NSArray* 中,您可以轻松地将其用作UITableView 数据存储,尤其是在您使用提取结果控制器时。