Objective-C: иерархическая передача CoreData в NavigationController - PullRequest
0 голосов
/ 21 декабря 2009

Мне нужно несколько советов по этой проблеме, которая у меня есть. У меня есть навигационный контроллер с корневым контроллером, использующим CoreData и NSFetchController. Теперь корневой контроллер работает нормально. Когда я нажимаю на элемент, иерархически он должен отображать следующий UITable, связывающий значения строки в предыдущем корневом контроллере.

Теперь я не уверен, что я должен передать как свойство следующему UITableViewController. Должен ли он быть массивом, или я должен передать NSFetchedResultsController? После второго уровня будет еще один уровень в иерархии, как примечание.

Спасибо Дорон

1 Ответ

3 голосов
/ 21 декабря 2009

У вас есть пара вариантов, по крайней мере:

  1. Передать ссылку на контроллер управляемого объекта из родительского контроллера представления в дочерний контроллер представления; или
  2. Сделать свойство 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, особенно если вы используете контроллер извлеченных результатов.

...