Open UIManagedDocument занимает слишком много времени

Недавно я работаю с приложением расписания в iOS, и у меня возникают проблемы с Core Data.

Мое приложение имеет основной пользовательский интерфейс, похожий на оригинальное приложение календаря, созданное Apple, и я сохраняю все данные о своих событиях в базе данных Core Data.

Я создаю UIManagedDocument для извлечения данных из базы данных с помощью его NSManagedObjectContext, и все работает нормально.

Однако мне нужно использовать NSManagedObjectContext для получения данных несколько раз в нескольких разных контроллерах представления во время выполнения. И каждый раз, когда я это делаю, мне нужно повторно открывать UIManagedDocument, но открытие документа занимает слишком много времени (это может занять 2 секунды или даже больше, мне нужно отобразить счетчик в поле зрения).

Итак, вот мои вопросы:

  1. Как правильно открыть управляемый документ? (Я имею в виду, например, открыть его во время обеденного перерыва?)
  2. Есть ли способ открыть управляемый документ только один раз и оставить его открытым во время выполнения? (Так что я могу все время использовать его контекст)
  3. Хранятся ли данные в управляемом документе, который я создаю? (Я обнаружил, что если я удалю документ, данные исчезнут)

Спасибо.


person Jason J    schedule 23.05.2013    source источник


Ответы (1)


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

Многие люди создают для этого синглтоны или помещают их в App Delegate. Я реализовал protocol, который позволяет мне размещать его там, где это удобно для конкретного приложения, при этом мой другой код не должен знать ничего об объекте, который возвращает информацию. Пока он отвечает протоколу, он может быть делегатом приложения, одноэлементным классом или объектом любого другого типа.

См. раздел импорт AppDelegate.

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

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

Удачи...

person LavaSlider    schedule 23.05.2013
comment
Очень ценю вашу помощь, и этот подход, кажется, работает, я открываю документ и сохраняю контекст как глобальный экземпляр, используя протокол. Однако проблема сбоя возникает только тогда, когда мое приложение возобновляет работу в фоновом режиме, и эта проблема возникает случайным образом. Консоль показывает сообщение об ошибке, например [UIManagedDocument _setInConflict:]. Должен ли я что-то сделать с глобальным экземпляром или UIManagedDocument в applicationDidEnterBackground или applicationWillEnterForeground? Любая помощь будет оценена. - person Jason J; 05.06.2013
comment
Я не сталкивался с этим, но имеет смысл, что в фоновом режиме может измениться некоторый статус в отношении вашего доступа к данным, так что возникнет конфликт (что-то вроде другого приложения или службы, изменяющего данные или соединение). Временами у меня были конфликты, когда более одного потока в моем приложении вносили изменения. Возможно, стоит попробовать сохранить и закрыть в applicationDidEnterBackground и повторно открыть в applicationWillEnterForeground. - person LavaSlider; 06.06.2013