Как переносить подкласс класса 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 – это уровень абстракции настойчивости, и вы можете создать резервную копию других реализаций хранилища, если хотите, включая собственные собственные .

  • Автозаполнение TextField с ответом JSON
  • Как перенести UIView на «нижний», чтобы отображался следующий UIView?
  • Как проверить, подключено ли устройство через трансляцию?
  • Основы iCloud и примеры кода
  • convertCoordinate toPointToView, возвращающий плохие результаты с наклонными картами
  • Изменить имя продавца на Appstore
  • Вопрос о ротации FBWebDialog в iPad
  • libXcodeDebuggerSupport.dylib отсутствует в SDK для разработки iOS 4.2.1
  • отправить приложение ios с помощью ios5 OS и ios5 sdk
  • Высота UIToolbar при вращении устройства
  • как реализовать календарь в режиме двух недель (пример использования JTCalendar)
  • Interesting Posts

    iOS – программатически проверяет подлинность приложения

    Временное доверие самоподписанным сертификатам с NSURLConnection

    UIImage cv :: Преобразование Mat с альфа-каналом

    Как VOIP + PushKit повторно запускает приложение из фона / убит из фона?

    Запись с RemoteIO: результат .caf – шаг сдвинут медленнее + искажен

    как добавить анимацию в экран запуска в iOS 9.3 с помощью Objective c

    Опция ApplePay недоступна в iOS Simulator

    iOS – Как рисовать точку на линии, в которой пользователь прикасается при перетаскивании

    Как добавить значок в строку состояния iphone / ipod?

    Пытается загладить первую букву каждого слова в текстовом поле Использование Swift

    Тени в SceneKit

    Удалите базовую модель данных при обновлении приложения iOS

    Как проверить, работает ли приложение IOS в первый раз, используя SWIFT

    Проведите левые жесты над UITextField

    Формула режима наложения наложения?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.