你有几个选择,至少:
- 将托管对象控制器的引用从父视图控制器传递给子视图控制器;或者,
- 使 MOC 属性可从应用程序委托中使用,任何视图控制器都可以使用该属性
有些人更喜欢第二种选择,因为您可以重用视图控制器并将其重新排列到不同的层次结构中。通过断开 MOC 与父控制器和子控制器的连接,您可以获得更多的设计灵活性。此外,如果您的应用程序需要同时管理多个持久性存储,那么从一个中心点访问以创建多个 MOC 可以降低代码复杂性。
一旦 MOC 在其视图控制器中,您可以在该视图控制器中创建获取的结果控制器并在它们自己的线程中应用操作。
编辑
听起来你在Site
和之间有一对多的关系Post
(即一个站点实体有许多帖子实体)。
您的“帖子”列表视图控制器可以包含site
托管对象、siteID
托管对象 ID 或siteName
字符串属性。
当您推送“帖子”列表 VC 时,设置其site
orsiteName
属性并相应地配置请求谓词。
例如,您的 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 存储以匹配名称或托管对象 ID 与您的条件等效的所有Post
实体。site
site
Once you perform the fetch, these entities generally reside in an NSSet*
or NSArray*
that you can easily use as a UITableView
data store, especially if you are using a fetched results controller.