У меня есть следующий простой вариант использования:
- A
NSTableView
, где пользователь может добавлять новые записи. Объект Entry
создается в Базовых данных и предварительно заполняется вычисленными значениями. - Когда пользователь дважды щелкает строку, он открывает подробный вид с возможностью для пользователя редактировать поля поля.
Entry
объект. - Пользователь может затем нажать Сохранить или Отменить, чтобы сохранить / отменить изменения.
Для реализации изменений Отмена / Отмена я использую дочерний элемент NSManagedObjectContext
в подробном представлении (которое получает объект Entry перед отображением). Код:
// Create child MOC
self.managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
self.managedObjectContext.parent = self.parentManagedObjectContext
guard let entryInChildContext = try? self.managedObjectContext.existingObject(with: self.entry.objectID) as? Entry else {
// Display error message
}
// Switch to the new context
self.entry = entryInChildContext
ПРОБЛЕМА
objectID
может быть временным, если вновь созданный Entry
еще не был сохранен в постоянном хранилище. В этом случае запись не может быть найдена в дочернем MOC.
ЧТО Я ПОПЫТАЛ, НО НЕ РАБОТАЛ
- Сохранение (вызов save ())основной ManagedObjectContext: вызывает проблемы с автоматическим сохранением (NSPersistentDocument.autoSavesInPlace возвращает true). Подробнее здесь .
- Вызов
managedObjectContext.obtainPermanentIDs(for: [newEntry])
, но это вызывает ту же проблему, как описано в предыдущем пункте. Вызов его на дочернем MOC также не работает.
Итак, как в таком случае я могу работать с дочерним managedObjectContext? Я действительно хочу иметь постоянный идентификатор объекта, потому что у объекта Entry нет собственного уникального поля.
Заранее спасибо за помощь!