Как переносить подкласс класса NSManagedObject между классами?

Мы создали слой репозитория для взаимодействия с allItems() данными, которые имеют такие методы, как allItems() , addItem:(Item*)item где item является подклассом NSManagedObject. Когда нам нужно сохранить элемент, мы вызываем метод в репозитории, передавая экземпляр подкласса в качестве аргумента. Однако это не работает, потому что мы не можем использовать init инициализации, и контекст скрыт внутри репозитория.

Каков наилучший способ передачи объектов, когда у вас есть такая архитектура? Делает ли ItemDTO мимоходом что-то вроде опции? Или есть лучшие способы решить эту проблему, например, вообще не использовать подклассы NSManagedObject и просто использовать ключ / значение, которое работает.

3 Solutions collect form web for “Как переносить подкласс класса NSManagedObject между классами?”

Я написал экземпляр с приложением пример проекта, который скрывает контекст от пользовательских классов модели: branch 10583736 .

(это не конечный производственный код, просто быстрый пример, не ожидайте, что он столкнется с многопоточными или странными ошибками)

Скрытие контекста для пользовательских классов – это просто определение пользовательских методов для решения любой ситуации, когда вы обычно запрашиваете контекст и используете его.

Вы можете определить класс для уровня хранилища, не подвергая контексту контекст :

 @interface DataStore : NSObject + (id)shared; - (void)saveAll; - (NSEntityDescription *)entityNamed:(NSString *)name; /* more custom methods ... */ - (NSManagedObject *)fetchEntity:(NSEntityDescription *)entity withPredicate:(NSPredicate *)predicate; @end 

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

 @interface DataObject : NSManagedObject + (NSString *)entityName; + (NSEntityDescription *)entity; - (void)save; /* more custom methods ... */ @end 

Наконец, ваши пользовательские классы модели определяют любой метод, который вам нужен, возможно, используя все, что предоставляется суперклассом:

 @interface Card : DataObject @property (nonatomic, retain) NSString * question; @property (nonatomic, retain) NSString * answer; @property (nonatomic, retain) Deck *deck; /* return a new card */ + (Card *)card; /* more custom methods ... */ @end 

Мастер- ветвь имеет более обычный подход, когда классы моделей получают контекст и работают с ним.

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

  • Экспортируйте контекст управляемого объекта другим объектам, обычно как свойство на вашем уровне репозитория.
  • Создайте свой слой репозитория и верните ему объекты. Это предполагает передачу имени объекта и возврат нового управляемого объекта соответствующего типа или класса объекта.

Если вы обнаружите, что боретесь с каркасами и придумываете чрезмерные абстракции, вы делаете это неправильно.

Как правило, вы хотите, чтобы контроллеры, создающие подклассы NSManagedObject имели указатель на NSManagedObjectContext . Таким образом, вы действительно можете вызвать инициализатор.

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

Вы можете использовать DTO, но в итоге у вас будет много дублирования, поэтому он станет уродливым. На мой взгляд, вам следует подумать о том, чтобы ваши контроллеры знали о контексте Core Data, чтобы он мог правильно извлекать или инициализировать элементы (управляемые объекты) и по существу использовать NSManagedObjectContext качестве уровня вашего репозитория.

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

  • IOS читает текст из MS Word
  • Устройство iPhone 3G «завершено», но приложение не загружается
  • Обнаружение установки приложения iOS AppStore
  • Странная ошибка в учебнике Apple Core Data
  • UIImagePickerController записывает видео с альбомной ориентацией
  • Выравнивание текста и изображения на UIButton с помощью imageEdgeInsets и titleEdgeInsets
  • iPhone - 3 множественных обнаружения UIGestureRecognizer
  • SearchBar TintColor не применяется правильно
  • Для интеграции iAd требуется регистрация или настройка объявлений?
  • Какой контент Apple предлагает для покупок в приложении и при каких условиях?
  • Цвет кнопки кнопки панели навигации отличается при проектировании через xib xcode5
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.