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