Лучший способ «сбросить» стек основных данных? - PullRequest
2 голосов
/ 21 февраля 2011

Мое приложение должно иметь возможность отключаться от сервера и подключаться к другому по своему усмотрению, что требует сброса любого сохраняемого хранилища, которое у нас есть.Проблема здесь заключается в том, что освобождение «основного» контекста управляемого объекта означает любые объекты в нем, которые я нахожу вокруг ошибки, которая вызывает все виды неожиданных небольших проблем и сбоев.

Есть ли лучший способ «перезагрузить»мой стек / управляемые объекты завалены вокруг программы, чем просто вызов release для всего в моем стеке основных данных?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Вам необходимо закрыть ваш базовый стек данных сверху вниз.

  1. Убедитесь, что ни один объект, кроме контекста управляемого объекта, например, не содержит никаких управляемых объектов. убедитесь, что объекты не содержатся в массиве, принадлежащем контроллеру пользовательского интерфейса.
  2. Сохраните контекст управляемого объекта, чтобы очистить все свободные концы.
  3. Полностью освободите контекст и обнулите его. В любом случае контекст никогда не должен храниться более чем одним объектом, например, делегатом приложения.
  4. Отправьте removePersistentStore:error: постоянному координатору хранилища.
  5. Используйте стандартные файловые операции для удаления самого файла хранилища.

Такое изменение основных данных на лету затруднительно, поскольку базовые данные - это не просто небольшая база данных, свисающая со стороны приложения. Он предназначен для того, чтобы служить целым слоем модели приложения. Так как Apple действительно занимается разработкой Model-View-Controller, то модель является реальным ядром программы (отсюда и название Core Data). Таким образом, вы не сможете включить и выключить ее так, как обычную базу данных SQL. ,

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

1 голос
/ 21 февраля 2011

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

[managedObjectContext reset];
...