У вас есть пара вариантов, по крайней мере:
- Передать ссылку на контроллер управляемого объекта из родительского контроллера представления в дочерний контроллер представления; или
- Сделать свойство MOC доступным из делегата приложения, который доступен для любого контроллера представления
Некоторые предпочитают второй вариант, так как вы можете повторно использовать и переставлять контроллеры представления в разные иерархии. Отключив MOC от родительского и дочернего контроллеров, вы получаете немного больше гибкости при проектировании. Кроме того, если вашему приложению необходимо одновременно управлять несколькими постоянными хранилищами, то получение доступа из одной центральной точки для создания нескольких MOC уменьшает сложность кода.
Когда у вас есть MOC в контроллере представления, вы можете создать свой извлеченный контроллер результатов в этом контроллере представления и применять операции в их собственных потоках.
EDIT
Звучит так, как будто у вас отношения один-ко-многим между Site
и Post
(то есть одна сущность сайта имеет много почтовых сущностей).
Контроллер представления списка «Записи» может содержать управляемый объект site
, идентификатор управляемого объекта siteID
или строковое свойство siteName
.
Когда вы нажимаете на ВК «Список», установите его свойство site
или siteName
и соответственно настройте предикат запроса.
Например, предикат вашего запроса на выборку должен содержать в себе что-то вроде 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];
// ...
Или вы можете сравнить идентификаторов управляемых объектов , что обычно лучше для уникальных сравнений:
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
сущностям, которые имеют site
имя или site
идентификатор управляемого объекта, эквивалентный вашим критериям.
После выполнения выборки эти сущности обычно находятся в NSSet*
или NSArray*
, который можно легко использовать в качестве хранилища данных UITableView
, особенно если вы используете контроллер извлеченных результатов.