Могу ли я создать основной объект данных без его сохранения?

#ios #swift #core-data

Вопрос:

Я создаю приложение, в котором вы можете иметь несколько журналов и иметь разные настройки для каждого журнала. Я храню Journal JournalSettings данные и в основных данных. Теперь я хочу разрешить пользователю редактировать настройки журнала по умолчанию, чтобы новые Journal s имели параметры JournalSettings , описанные в настройках журнала по умолчанию. Я использую UserDefaults для хранения настроек журнала по умолчанию, потому что это подходящее место для хранения значений по умолчанию. У меня уже есть JournalSettingsView возможность отображать JournalSettings объект, и я хотел бы повторно использовать это представление для отображения и редактирования настроек журнала по умолчанию. Поэтому я хочу создать JournalSettings экземпляр из данных настроек журнала по умолчанию, хранящихся в файлах пользователей, но я не хочу сохранять этот новый JournalSettings экземпляр в основных данных, потому что это будет просто копия данных, уже сохраненных в файлах пользователей.

Могу ли я создать экземпляр объекта основных данных, никогда не сохраняя его в Основных данных? Я думал, что смогу использовать дочерний элемент в памяти NSManagedObjectContext , в котором я создам JournalSettings соответствующие настройкам журнала по умолчанию, но, насколько я понимаю, этот дочерний контекст затем сохранится в родительском контексте (мой основной контекст основных данных). Я также попытался создать отдельную (не дочернюю) память NSManagedObjectContext для хранения по умолчанию JournalSettings , но затем мое приложение вылетает с ошибкой:

 Multiple NSEntityDescriptions claim the NSManagedObject subclass 'JournalSettings' so  entity is unable to disambiguate.
 

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

  1. Переместите настройки журнала по умолчанию в Основные данные. Это сработало бы хорошо; UserDefaults просто кажется более подходящим местом для хранения значений по умолчанию.
  2. Создайте новое представление для отображения/редактирования параметров журнала по умолчанию вместо повторного JournalSettingsView использования . Это тоже сработало бы, но было бы немного неприятно управлять двумя представлениями, которые должны показывать одно и то же. Единственное реальное различие между представлениями будет заключаться в том, что одно из них будет вводиться как JournalSettings экземпляр, в то время как другому будут передаваться JournalSettings атрибуты (например, размер шрифта, название журнала и т.д.) По отдельности.

Комментарии:

1. Я вообще не понимаю, зачем вам понадобились основные данные для журналов, мне кажется, это слишком сложное решение.

Ответ №1:

Дочерний контекст-это решение, которое вы ищете.

Из документации:

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

  • Управление удаляемыми изменениями, например, в окне инспектора или представлении.

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

Связанные с другими вашими идеями:

  1. Какое хранилище подходит лучше всего: UserDefault или CoreData. Это зависит от того, какой тип настроек JournalSettings представляют. Если это настройки, связанные с данными (в качестве объектов справочных данных и т. Д.) Я бы хранил на компакт-диске. Но если это общие настройки, которые не зависят от данных, то UD-лучшее место. И не забывайте, что UD не может быть удален системой / потерян. Поэтому вы никогда не должны хранить в нем конфиденциальные / важные данные.
  2. Возможно, вам не нужно создавать новое представление. Вместо этого вы можете извлекать операции, связанные с данными, в другой сущности (контроллер в MVC, модель представления в MVVM…). В таком случае у вас будет одно представление, независимое от типа хранилища.

Ответ №2:

Для Swift 5

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

 let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

let dataModel = CoreDataEntityModel(context: childContext)