Понимание основных данных в приложении на основе документов - PullRequest
0 голосов
/ 07 августа 2020

Я создаю приложение на основе документа, впервые использую 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 запускает ту же ошибку, как только я открываю вторую документ

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