2015-10-22 3 views
1

Я использую основные данные для кэширования данных сервера в модуле, который я пишу, и хотел бы, чтобы обеспечить, чтобы другие части приложения не изменяли эти данные.Возможно ли вернуть NSManagedObjects только для чтения в Core Data?

Можно ли пометить либо мои экземпляры NSManagedObject, либо NSManagedObjectContext, используемые для их извлечения, как только для чтения? Поскольку контекст доступен непосредственно из объекта, пользователи могут изменять объект и вызывать [obj.managedObjectContext save:&errror].

Я видел множество ссылок на создание полностью доступного для чтения хранилища (например, здесь: Unable to create a readonly sqlite store in Core Data: Cocoa Error 260), но я не хочу, чтобы сам NSPsistentStore был доступен только для чтения (модуль, который я пишу, должен быть способен написать ему).

Одним из вариантов является преобразование управляемых объектов в простые подклассы NSObject с теми же свойствами. Но тогда я теряю некоторые приятные вещи, такие как ленивая загрузка и т. Д., Которые могут делать Core Data.

Любые идеи?

ответ

0

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

  • Если вы используете пользовательские подклассы NSManagedObject, можно добавить логическое readOnlyMode свойства к классу (не к лицу). Затем вы можете переопределить методы setter, чтобы проверить это свойство, прежде чем что-либо делать. Вы получите поведение для каждого объекта только для чтения, но нет ничего, что могло бы помешать другим частям приложения просто изменить это значение.
  • Вы можете сделать что-то подобное на самом NSManagedObjectContext. Создайте свой собственный подкласс, который вы всегда используете, и добавьте аналогичное свойство readOnlyMode, которое вы проверяете при вызове save:. Но любой может изменить этот флаг.

Или вы могли бы сделать это суровым способом. Используйте переменную Boolean readOnly в одном из ваших собственных классов контроллеров. Затем слушайте NSManagedObjectContextObjectsDidChangeNotification. Если это уведомление поступит в режиме только для чтения, выполните сбой приложения. Если остальная часть приложения разрабатывается людьми, якобы в той же команде, что и вы, это должно быть совершенно разумным, поскольку это произойдет только во время разработки приложения.

Смежные вопросы