Передача managedObjectContext - это эффективно? - PullRequest
1 голос
/ 21 сентября 2011

У меня есть приложение, над которым я работаю.Имеется навигационный контроллер, и мой appDelegate передает свой managedObjectContext корневому контроллеру навигационных контроллеров следующим образом:

RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
rootViewController.managedObjectContext = self.managedObjectContext;

(Бонусный вопрос - я прочитал выше, является предпочтительным способом передачиконтекст, в отличие от некоторых примеров, которые я вижу, когда контроллер представления извлекает контекст у делегата - это правильно? Кроме того, мне нужно выпустить rootViewController выше, или я прав в том, что он автоматически выпущен, потому что он не был создан с помощьюalloc или new?)

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

Моя первоначальная мысль состоит в том, чтобы передать managedObjectContext из rootVC в detailVC и выполнить чтение данных и запросыв деталях ВК.Это правильный способ для этого или лучше выполнить запрос в rootVC и передать данные в детальный контроллер в виде массива или чего-то еще?Или это не имеет значения, кроме организационно (без разницы в производительности) - 6 из одного, полдюжины из другого?

Ответы [ 3 ]

4 голосов
/ 21 сентября 2011

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

Шаблоны основных данных Apple довольно ужасны Вообще говоря, лучше выделить ваше управление данными в отдельный класс менеджера, который отвечает за управление вашими данными.

2 голосов
/ 22 сентября 2011

Я думаю, что передача MOC вокруг ваших контроллеров представления, как вы сказали в своем вопросе, является хорошим подходом. Идея шаблона MVC заключается в том, что контроллеры представлений заботятся о бизнес-логике, поэтому в таком случае, если вы передадите ему MOC (который в конце модели), вы дадите второму контроллеру представления возможность выполнять свою собственную бизнес-логику. независимо от любого другого контроллера представления.

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

Наконец, вы можете использовать, как предложено в другом посте, синглтон, который заботится обо всех взаимодействиях MOC. Но, на мой взгляд, при таком подходе вы добавляете дополнительный уровень управления поверх существующего уровня управления, который представлен MOC. Этот подход имеет смысл, когда вы хотите избавиться от всего, что связано с бизнес-логикой в ​​ваших контроллерах представления, но обычно это желательно, когда есть много сложных действий, которые должны совместно использоваться несколькими контроллерами представления: но в таком случае, вероятно, пришло время подумать о другой организации вашего приложения.

Наконец мой ответ на ваш бонусный вопрос: вам не нужно выпускать контроллер представления, не делайте этого! Пока он не находится внутри контроллера навигации и вы не отпустите контроллер навигации, ваш контроллер представления защищен от освобождения.

1 голос
/ 22 сентября 2011

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

Обычно я создаю класс для обработки различных битов и бобов базовых данных.Я делаю это синглтоном, к которому можно получить доступ где угодно с одним вызовом.Затем я вызываю метод для получения MOC.Например:

myMOC = [[MyPersistentStoreController sharedMyPersistentStoreController] managedObjectContext]];

Для получения информации о том, как легко создать синглтон, посмотрите блог Мэтта Галлахера.

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