Core data 在SwiftUI中从coredata删除记录时崩溃

Core data 在SwiftUI中从coredata删除记录时崩溃,core-data,swiftui,Core Data,Swiftui,我为coredata中的音频项目制作了一个列表。删除后,崩溃报告为“EXC_断点(代码=1,子代码=0x1b8fb693c)”,为什么 使用时 ForEach(items, id: \.self) ,它起作用了。但我的音频有id属性并遵循可识别协议 更新:我发现添加if{}子句可以修复崩溃,但为什么?“静态UUID.unconditionallyBridgeFromObjectiveC(:)()”处的断点 struct Test1View:View{ @环境(\.managedObjectCo

我为coredata中的音频项目制作了一个列表。删除后,崩溃报告为“EXC_断点(代码=1,子代码=0x1b8fb693c)”,为什么

使用时

ForEach(items, id: \.self)
,它起作用了。但我的音频有id属性并遵循可识别协议

更新:我发现添加if{}子句可以修复崩溃,但为什么?“静态UUID.unconditionallyBridgeFromObjectiveC(:)()”处的断点

struct Test1View:View{
@环境(\.managedObjectContext)变量上下文
@FetchRequest(FetchRequest:Audio.fetchAllAudios())变量项:FetchedResults
var body:一些观点{
名单{
ForEach(items){item in

如果为true{/我在周末遇到了同样的问题。看起来SwiftUI想要打开我从CoreData读取的值,并且由于该值已被删除,它崩溃了

在我的例子中,我确实通过对我从CoreData使用的所有值进行零合并来解决它

您可以尝试为item.name提供默认值

ForEach(items) { item in
            HStack {
                Text("\(item.name ?? "")")
            }
        }

我发现崩溃的原因,必须提供可选,因为OC/swift对象转换:

皈依

class Audio: NSManagedObject, Identifiable {
    @NSManaged public var id: UUID
    @NSManaged public var name: String
    @NSManaged public var createAt: Date
}


我和你有同样的问题

可能使用您自己的
id
属性使其
可识别是个坏主意,因为删除对象时,核心数据会将所有属性设置为
nil
,即使您在Swift CoreData类中以不同的方式声明它。 删除实体时,
id
属性失效,对象
.isFault
属性设置为
true
,但SwiftUI
ForEach
仍保留对此id对象(=您的UUID)的一些引用,以便能够计算“before”和“after”列表的状态,并试图以某种方式访问它,导致崩溃

因此,建议如下:

  • 通过检查
    isFault
    ,保护详细视图(在
    ForEach
    循环中):
  • 如果entity.isFault{
    EmptyView()
    }
    否则{
    //您的常规视图主体
    }
    
  • 期望您的
    id
    属性为
    nil
    ,或者在核心数据模型中将其相应地定义为可选属性
  • @NSManaged公共变量id:UUID?
    
    或者通过不依赖SwiftUI
    ForEach
    循环中的
    可识别的
    协议:

    ForEach(实体,id:\.self){entity in…}
    

    ForEach(实体,id:\.objectID){entity in…}
    

    结论:您确实不需要将所有CoreData属性设置为Swift
    可选的
    s。在
    ForEach
    循环中引用的
    id
    属性处理删除(=将其值设置为
    nil
    )非常重要优雅地。

    我有另一个代码,与此示例代码相同,运行良好。我混淆了。和
    ForEach(items,id:\.self)
    将修复此代码。如果这真的是SwiftUI中的CoreData问题,那就太糟糕了。我想知道我是否在这段代码中犯了一些错误。问题是
    UUID。_无条件地从ObjectiveC
    ,无指针。添加if true{}子句将修复崩溃,但为什么?
    ForEach(items){item in if true{HStack{Text(\(item.name)”)}}}
    你救了我!我花了30分钟处理了这个错误并解决了:)
    ForEach(items) { item in
                HStack {
                    Text("\(item.name ?? "")")
                }
            }
    
    class Audio: NSManagedObject, Identifiable {
        @NSManaged public var id: UUID
        @NSManaged public var name: String
        @NSManaged public var createAt: Date
    }
    
    class Audio: NSManagedObject, Identifiable {
        @NSManaged public var id: UUID?
        @NSManaged public var name: String?
        @NSManaged public var createAt: Date?
    }