#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.
Если я не могу создать основной объект данных без его сохранения, есть несколько способов, которыми я все еще могу реализовать настройки журнала по умолчанию, но я не уверен, что было бы лучше всего:
- Переместите настройки журнала по умолчанию в Основные данные. Это сработало бы хорошо; UserDefaults просто кажется более подходящим местом для хранения значений по умолчанию.
- Создайте новое представление для отображения/редактирования параметров журнала по умолчанию вместо повторного
JournalSettingsView
использования . Это тоже сработало бы, но было бы немного неприятно управлять двумя представлениями, которые должны показывать одно и то же. Единственное реальное различие между представлениями будет заключаться в том, что одно из них будет вводиться какJournalSettings
экземпляр, в то время как другому будут передаватьсяJournalSettings
атрибуты (например, размер шрифта, название журнала и т.д.) По отдельности.
Комментарии:
1. Я вообще не понимаю, зачем вам понадобились основные данные для журналов, мне кажется, это слишком сложное решение.
Ответ №1:
Дочерний контекст-это решение, которое вы ищете.
Из документации:
Если родительское хранилище контекста является другим контекстом управляемого объекта, операции извлечения и сохранения выполняются родительским контекстом, а не координатором. Этот шаблон имеет ряд сценариев использования, в том числе:
- Управление удаляемыми изменениями, например, в окне инспектора или представлении.
Вы правы в том, что при сохранении дочернего контекста изменения данных будут распространяться на родительский контекст.
в вашем случае вам вообще не нужно сохранять дочерний контекст.
Связанные с другими вашими идеями:
- Какое хранилище подходит лучше всего: UserDefault или CoreData. Это зависит от того, какой тип настроек
JournalSettings
представляют. Если это настройки, связанные с данными (в качестве объектов справочных данных и т. Д.) Я бы хранил на компакт-диске. Но если это общие настройки, которые не зависят от данных, то UD-лучшее место. И не забывайте, что UD не может быть удален системой / потерян. Поэтому вы никогда не должны хранить в нем конфиденциальные / важные данные. - Возможно, вам не нужно создавать новое представление. Вместо этого вы можете извлекать операции, связанные с данными, в другой сущности (контроллер в MVC, модель представления в MVVM…). В таком случае у вас будет одно представление, независимое от типа хранилища.
Ответ №2:
Для Swift 5
Если вы используете свой основной контекст, даже без сохранения, данные все равно будут «в контексте». Поэтому , если вы хотите использовать модель основных данных без ее сохранения, вам нужно создать дочерний контекст и использовать его в контексте модели.
let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
let dataModel = CoreDataEntityModel(context: childContext)