Objective-C: иерархическая передача CoreData в NavigationController
Мне нужно некоторое руководство по этой проблеме, которую я имею. У меня есть навигационный контроллер с корневым контроллером, использующим CoreData и NSFetchController. Теперь корневой контроллер работает нормально. Когда я нажимаю на элемент, иерархически он должен отображать следующий UITable, связывающий значения для строки в предыдущем корневом контроллере.
Теперь я не уверен, что я должен передать в качестве свойства следующему UITableViewController. Должен ли он быть массивом, или я должен передать NSFetchedResultsController? Будет второй уровень в иерархии после второго, как примечание.
Спасибо Дорон
1 ответ
У вас есть пара вариантов, по крайней мере:
- Передать ссылку на контроллер управляемого объекта из родительского контроллера представления в дочерний контроллер представления; или же,
- Сделайте свойство MOC доступным из делегата приложения, который доступен для любого контроллера представления
Некоторые предпочитают второй вариант, так как вы можете повторно использовать и переставлять контроллеры представления в разные иерархии. Отключив MOC от родительского и дочернего контроллеров, вы получаете немного больше гибкости при проектировании. Кроме того, если вашему приложению необходимо управлять более чем одним постоянным хранилищем одновременно, то получение доступа из одной центральной точки для создания нескольких MOC уменьшает сложность кода.
Если у вас есть MOC в контроллере представления, вы можете создать свой извлеченный контроллер результатов в этом контроллере представления и применять операции в своих собственных потоках.
РЕДАКТИРОВАТЬ
Похоже, у вас есть отношения один ко многим между 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
хранилище данных, особенно если вы используете контроллер полученных результатов.