gpt4 book ai didi

core-data - 从 SwiftUI 中的核心数据中删除记录时崩溃

转载 作者:行者123 更新时间:2023-12-04 12:13:30 29 4
gpt4 key购买 nike

我从 coredata 中列出了音频项目。删除后,崩溃报告为“EXC_BREAKPOINT (code=1, subcode=0x1b8fb693c)”,为什么?

使用时

ForEach(items, id: \.self)

, 有用。但我的音频具有 id 属性并遵循可识别协议(protocol)。

更新:我发现添加 if{} 子句可以修复崩溃,但为什么呢?在“静态 UUID.unconditionallyBridgeFromObjectiveC(:) ()”处断点。
struct Test1View: View {
@Environment(\.managedObjectContext) var context
@FetchRequest(fetchRequest: Audio.fetchAllAudios()) var items: FetchedResults<Audio>
var body: some View {
List {
ForEach(items) { item in
if true { // <- this if clause fix crash, but why?
HStack {
Text("\(item.name)")
}
}
}.onDelete(perform: { indexSet in
let index = indexSet.first!
let item = self.items[index]
self.context.delete(item)
try? self.context.save()
})
}
}
}

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

struct Test1View: View {
@Environment(\.managedObjectContext) var context
var fetchRequest: FetchRequest<Audio> = FetchRequest<Audio>(entity: Audio.entity(), sortDescriptors: [NSSortDescriptor(key: "createAt", ascending: false)])
var items: FetchedResults<Audio> { fetchRequest.wrappedValue }
var body: some View {
List {
ForEach(items) { item in
HStack {
Text("\(item.name)")
}
}.onDelete(perform: { indexSet in
let index = indexSet.first!
let item = self.items[index]
self.context.delete(item)
try? self.context.save()
})
}
}
}

最佳答案

我和你有同样的问题。
使用自己的 id 可能是个坏主意属性使其成为Identifiable因为 Core Data 将所有属性设置为 nil当对象被删除时,即使您在 Swift CoreData 类中以不同的方式声明它。
删除您的实体时,id属性失效,对象 .isFault属性设置为 true ,但 SwiftUI ForEach仍然持有对这个 ID 对象(=您的 UUID)的一些引用,以便能够计算列表的“之前”和“之后”状态,并以某种方式尝试访问它,从而导致崩溃。
因此有以下建议:

  • 保护详细 View (在 ForEach 循环中通过检查 isFault :

  • if entity.isFault {
    EmptyView()
    }
    else {
    // your regular view body
    }
  • 期待您的 id属性为 nil ,或者通过在您的核心数据模型中相应地将其定义为可选

  • @NSManaged public var id: UUID?
    或通过 不靠Identifiable SwiftUI 中的协议(protocol) ForEach环形:
    ForEach(entities, id: \.self) { entity in ... }
    或者
    ForEach(entities, id: \.objectID) { entity in ... }
    结论:你真的不需要让你所有的 CoreData 属性都是 Swift Optional s。重要的是您的 id ForEach 中引用的属性循环优雅地处理删除(=将其值设置为 nil )。

    关于core-data - 从 SwiftUI 中的核心数据中删除记录时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60604658/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com