Я создаю приложение на основе документа, впервые использую swift / SwiftUI и основные данные. Мой подход к CRUDing работает, но почему-то не кажется «правильным». Может быть, есть более элегантный способ сделать это. В моем Document-Class я получаю свой NSManagedObjectContext. Помимо этого, я определяю еще один объект среды - класс, в котором хранятся мои объекты
class MainContent: ObservableObject {
@Published var entity1:[Entity1]! = []
@Published var entity2:[Entity2]! = [] }
Эти два объекта EnvironmentObject теперь доступны во всем приложении - сначала мой контекст, затем мой mainContent.
Всякий раз, когда я хочу добавить объект, я вызываю функцию и передаю контекст и все данные. Это не обновило sh фактическое представление (если только я не перезапустил приложение), поэтому в результате мне нужно было вернуть обновленный массив:
Button(action: {
// Add new - if that fails catch the error
do {
self.mainContent.entity1 = try addEntity1(context: self.context, name: self.textFieldName)
/* ... */
} catch {
/* Errorhandling */
}
} ) {
Text("Add")
}
Соответствующая функция выглядит примерно так:
func addEntity1(context:NSManagedObjectContext, name:String) throws -> [Entity1] {
/* ... check if entered data is ok */
let newData = Entity1(context: context)
newData.name = name
// Errorhandling
// if function didn't throw -> update mainContent.Entity1
let rows: [Entity1]!
do {
rows = try fetchEntity1(context: context)
} catch {
/* ... */
}
return rows
}
Это лучший способ решить эту проблему? или есть какой-то более простой способ, для которого не нужен второй EnvironmentObject (так что мой mainContent) - и тем самым не передавать все данные из моей функции каждый раз? Это решение также имело недостаток в том, что Undo / redo не обновляет представления - так что, возможно, я просто делаю что-то не так.
EDIT
Я обнаружил @ Свойство FetchRequest для загрузки данных в моем представлении, не сохраняя их где-то между ними. Однако у этого есть еще один недостаток: всякий раз, когда я открываю второй документ, консоль выдает кучу ошибок, например
2020-08-17 10:10:50.252574+0200 testApp[1282:25685] [error] warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'Department' so +entity is unable to disambiguate.
CoreData: warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'Department' so +entity is unable to disambiguate.
2020-08-17 10:10:50.252658+0200 testApp[1282:25685] [error] warning: 'Department' (0x60000351ca50) from NSManagedObjectModel (0x60000210def0) claims 'Department'.
CoreData: warning: 'Department' (0x60000350d340) from NSManagedObjectModel (0x60000212e5d0) claims 'Department'.
2020-08-17 10:10:50.252741+0200 testApp[1282:25685] [error] error: +[Department entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
. Я нашел множество решений этой проблемы, но ни одно из них не работает. Я убедился, что MO C был введен правильно, как предложено здесь SwiftUI @FetchRequest вызывает сбой приложения и возвращает ошибку
Я изменил модуль объекта, как предлагается здесь Невозможно найти специфику c подкласс NSManagedObject
Я создал пустой набор данных в классе Document для новых файлов (прочитал это где-то - больше не могу найти ссылку)
let isNew = self.fileURL == nil
if isNew {
_ = Department(context: self.managedObjectContext!)
_ = Cue(context: self.managedObjectContext!)
_ = Task(context: self.managedObjectContext!)
}
Я сделал небольшой пример с несколькими строками кода и поделился им на gitHub здесь: https://github.com/Duras666/PersonListTest Даже это небольшое приложение basi c запускает ту же ошибку, как только я открываю вторую документ