Где я должен поместить свой NSFetchedResultsControllerDelegate? - PullRequest
0 голосов
/ 04 апреля 2011

Я учу себя программировать, создав простое приложение для детализации основных данных с UINavigationController, в котором вы выбираете сущность прародителя для просмотра UITableView родителей, а затем выбираете родителя для просмотра детей. Всякий раз, когда пользователь выбирает элемент, я использую свойства, чтобы передать NSManagedObjectContext и NSFetchedResultsController для следующего просмотра. Каждый контроллер представления является UITableViewController, и все они соответствуют протоколу NSFetchedResultsControllerDelegate.

Это работает нормально, но означает, что каждый контроллер представления реализует методы делегата и т. Д., Что кажется неэффективным.

Чтобы упростить приложение, было бы лучше иметь один NSFetchedResultsControllerDelegate, на который ссылаются все мои контроллеры представления? И где будет лучшее место для этого - делегат приложения?

Спасибо!

--------------------------- EDIT ---------------- ------------

Я пытаюсь получить ответ GorillaPatch для работы ниже. В моем дочернем представлении у меня есть этот метод, который является методом делегата для модального «Добавление View Controller»:

- (void)addingViewController:(AddingViewController *)addingViewController didAdd:(NSString *)itemAdded
{   
    NSManagedObjectContext *context = [parent managedObjectContext];
    Child *newChild = [NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:context];

    [self.children insertObject:newChild atIndex:0];

    newChild.name = itemAdded;
    newChild.dateStamp = [NSDate date];


    // Save the context.
    NSError *error = nil;
    if (![context save:&error])
    {
        // Handle The Error.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    [self dismissModalViewControllerAnimated:YES];
}

И в заголовочном файле есть следующее:

@property (nonatomic, retain) Trip *trip;
@property (nonatomic, retain) Checklist *checklist;
@property (nonatomic, retain) NSMutableArray *checklists;

Ответы [ 5 ]

3 голосов
/ 04 апреля 2011

По моему скромному мнению, определенно нет. В общем, вам нужна отдельная реализация NSFetchedResultsControllerDelegate для каждого представления, потому что то, что вы на самом деле делаете в каждом методе делегата, может и будет отличаться (если ваше приложение не очень простое).

2 голосов
/ 04 апреля 2011

Почему вы передаете NSFetchedResultsController и NSManagedObjectContext (MOC) дочернему или подробному контроллеру?Я настоятельно рекомендую определить свойство в контроллере подробного представления , который является объектом, который вы хотите показать.

Например, если у вас есть список рецептов, извлеченных из CoreData, и вы вкладываете нарецепт, у вас будет скользящий контроллер детального вида, в котором будут отображаться детали рецепта.Я бы предложил реализовать его, имея подкласс UIViewController, который имеет переменную экземпляра currentRecipe.Затем вы должны установить для этой переменной экземпляра рецепт, который вы добавили в свой список, а затем поместить контроллер представления в стек.

Таким образом вы действительно отделите свой пользовательский интерфейс .Это делает этот контроллер представления многократно используемым во всей программе.

Обновление

В связи с нашей длительной дискуссией я хотел бы предоставить больше материала, который может быть полезен, если вы хотите узнать больше о шаблонах проектирования MVC.и о том, как реализовать навигацию с детализацией на iPhone.

  1. Пример кода: Посмотрите на приложение iPhoneCoreDataRecipes , которое было продемонстрировано на WWDC09 и WWDC10.чтобы проиллюстрировать, как реализовать стек контроллеров подробного представления и как они взаимодействуют друг с другом.
  2. видео сеансов WWDC: есть несколько видео сеансов WWDC, которые могут быть полезны:
    • WWDC10: Сессия 116 - Model-View-Controller для iPhone OS
    • WWDC09: Сессия 125 - Эффективная архитектура приложения iPhone
2 голосов
/ 04 апреля 2011

Я бы рекомендовал использовать экземпляр FetchedResultsController для каждого UITableView. Причина в том, что FRC реагирует на изменения данных. Вы можете прочитать о FRC здесь: http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html

Если вы установите делегата для извлеченного контроллер результатов, контроллер регистрируется для получения изменений уведомления от своего управляемого объекта контекст. Любые изменения в контексте который влияет на результирующий набор или раздел информация обрабатывается и результаты обновляются соответственно. контроллер уведомляет делегата, когда результирующие объекты меняют местоположение или когда разделы изменены (см. NSFetchedResultsControllerDelegate). Вы обычно используете эти методы для обновить отображение табличного представления.

Кроме того, если вы выполняете детализацию, как вы сказали, каждое новое дочернее представление должно представлять собой уникальный набор данных, который не позволит вам совместно использовать FRC.

2 голосов
/ 04 апреля 2011

Нет, вам, вероятно, будет лучше, если вы создадите базовый класс, который реализует NSFetchedResultsControllerDelegate (который, вероятно, будет подклассом UITableViewController) и содержит экземпляр NSFetchedResultsController, а затем расширяет ваш базовый класс везде, где вам это нужно.

Если у вас есть несколько уровней для детализации, наиболее вероятный сценарий состоит в том, что единственное, что изменится в ваших реализациях, - это предикат, используемый для получения вашего экземпляра NSFetchedResultsController.

1 голос
/ 05 апреля 2011

Чтобы расширить предыдущие ответы:

NSFetchedResultsController является частью уровня контроллера в проекте приложения Model-View-Controller. Имя проекта должно быть Model-Controller-View, потому что контроллер является посредником между моделью данных (в данном случае Core Data) и представлением. Таким образом, FRC должен быть настроен для нужд каждого конкретного табличного представления, чьи данные он выбирает, сортирует и управляет. Он должным образом принадлежит делегату источника данных tableview, который обычно является просто объектом контроллера tableview.

Рассматриваемый вами проект будет работать только в том случае, если в каждой отдельной таблице используется один и тот же объект с точно таким же порядком сортировки. В таком случае зачем использовать несколько таблиц?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...