1

我正在创建一个基于文档的应用程序,第一次使用 swift / SwiftUI 和核心数据。我的 CRUDing 方法有效——但它似乎并不“正确”。也许有一种更优雅的方式来做到这一点。在我的文档类中,我得到了我的 NSManagedObjectContext。除此之外,我定义了另一个环境对象——一个保存我的实体的类

class MainContent: ObservableObject {
@Published var entity1:[Entity1]! = []
@Published var entity2:[Entity2]! = [] }

这两个 EnvironmentObjects 现在可以在整个应用程序中使用 - 首先是我的上下文,其次是我的 mainContent。

每当我想添加一个对象时,我都会调用一个函数并传入上下文和所有数据。这并没有刷新实际视图(除非我重新启动了应用程序),因此我需要返回一个更新的数组:

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) - 这样就不会每次都将整个数据从我的函数中传回?这个解决方案也带来了撤消/重做不更新视图的缺点 - 所以也许我在这里做错了。

编辑

我发现 @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

我找到了很多解决这个问题的方法——尽管它们都不起作用。我确保按照此处的建议正确注入了 MOC SwiftUI @FetchRequest 使应用程序崩溃并返回错误

我像这里建议的那样更改了实体模块Unable to find specific subclass of NSManagedObject

我在 Document-class 中为新文件创建了一个空数据集(在某处阅读 - 再也找不到链接了)

        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 即使这个基本的小应用程序也会遇到同样的错误,只要我打开第二个文档

4

0 回答 0