Основные данные: когда и где объекты загружаются в первую очередь? - PullRequest
0 голосов
/ 04 августа 2010

У меня есть вопрос по поводу Core Data.Когда при запуске моего приложения мои данные (которые автоматически сохраняются в Core Data) загружаются в NSArrayControllers?Прежде всего, я хочу изменить его, прежде чем пользователь сможет взаимодействовать с ним.

Если говорить более конкретно: у меня есть NSArrayController для списка прав доступа.Прежде чем пользователь сможет добавлять новые плейлисты или вообще взаимодействовать с приложением, я хочу программно изменить плейлисты.Я попытался windowControllerDidLoadNib: в моем NSPersistentDocument (MyDocument.m) и awakeFromNib в моем NSPersistendDocument и NSArrayController, но когда я проверяю эти методы с помощью [[myArrayController arrangedObjects] count], я получаю 0 как результат (содержимое контроллера массива пусто).

Тем не менее, у меня на самом деле хранятся данные, и они отображаются пользователю.Я просто не знаю, когда и где я могу изменить его.

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 04 августа 2010

Данные никогда не «загружаются» в NSArrayController.Контроллер массива не является самим массивом.Он не содержит или иным образом не хранит данные.

Вместо этого контроллер массива запрашивает объект, с которым он связан, для определенных частей данных, только когда эти конкретные данные необходимы.Это особенно верно для базовых данных, в которых управляемые объекты полностью создаются только при обращении к их атрибутам.Контроллер массива перемещает данные из структуры данных типа массива в другой объект (обычно это элемент пользовательского интерфейса).

Если вы хотите изменить существующее хранилище, прежде чем оно отобразится в пользовательском интерфейсе, вам нужно обработать данные до того, какконтроллер массива, используемый UI, даже инициализирован.Если вы используете NSPersistentDocument, то вы можете переопределить readFromURL:ofType:error: для извлечения и изменения всех ваших объектов при первом открытии документа.Кроме того, вы можете переопределить методы windowWillLoad или showWindow контроллера окна.

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

0 голосов
/ 04 августа 2010

Вы могли бы попытаться наблюдать путь к клавиатуре "agedObjects "контроллера и добавить некоторую логику для работы, чтобы ваш контроллер массива был заполнен впервые.

Другой возможный хук - реализация методов ваших управляемых объектов awakeFromInsert / awakeFromFetch.

...