如何解决从上下文中删除后核心数据对象不为零
我使用的是核心数据,我的设置涉及一个名为 Track 的实体和另一个名为 Version 的实体。 Track 与 Version 是一对多的关系。每个版本都有一个文件路径和 id 属性。我有一个视图,其中有一个列表,其中该部分是一个显示曲目标题的视图,与曲目关联的每个版本都是一行。出于测试目的,我目前在每一行中显示 version.id 和 version.filepath。当按删除按钮删除版本时,调用以下方法:
track.removeFromVersions(version)
self.context.delete(version)
fileManager.removeItem(at: filePath) //filePath associated with the version
当发生这种情况时,version.id 不会被删除和消失,而是从 # 显示的任何内容更改为 0。如果我导航到不同的视图并返回到列表视图,删除的行就会消失。
我试图了解发生了什么。当我删除该行时,version.filePath 为零。我想知道为什么从 Track 和上下文中删除 version 后 version.id 和 version 本身不为零。
struct TrackItem: Identifiable {
var track: Track
var versions: [Version]
}
class AudioData : ObservableObject {
@Published var trackItems : [TrackItem]?
init() {
self.trackItems = loadTrackItems()
}
func loadTrackItems() -> [TrackItem] {
let tracks: [Track] = DataManager.getTracks()
var trackItems: [TrackItem] = []
print("LOADING TRACK ITEMS")
for track in tracks {
let trackItem = TrackItem(track: track,versions: track.versions?.allObjects as! [Version])
trackItems.append(trackItem)
print(track.title)
for version in track.versions!{
let v = version as? Version
print(v?.filePath ?? "nothing")
}
}
return trackItems
}
func deleteVersion(track: Track,version: Version) {
track.removeFromVersions(version)
DataManager.deleteVersion(version: version)
objectwillChange.send()
}
}
// View for displaying Version row
struct SubHeaderView: View {
var version : Version
var track: Track
var audioData: AudioData
@Binding var itemDeleted: Bool
var body: some View {
HStack {
Button {
self.audioData.deleteVersion(track: track,version: version)
}
let versionText = "Version"
let versionNumer = String(version.id)
if let filePath = version.filePath {
let fileUrl = DataManager.loadFileWithPath(lastPathComponent: version.filePath!)
let lastComponent = fileUrl.lastPathComponent
}
Text(versionText + versionNumer).offset(x: 8).font(.callout)
Text(version.filePath ?? "nothing")
}
}
}
// View for displaying list
struct SecondView: View {
@StateObject var audioData = AudioData()
@State var itemDeleted: Bool = false
var body: some View {
ZStack {
List {
ForEach(self.audioData.trackItems!) { trackItem in
Section(header: HeaderView(trackItem: trackItem),footer: EmptyView()) {
ForEach(trackItem.versions) { version in
SubHeaderView(version: version,track: trackItem.track,audioData: self.audioData,itemDeleted: $itemDeleted)
}
}
}
}
}
}
}
列表视图
删除版本 2
版本设置
解决方法
当您删除一个版本时,您发布的 trackItems
变量不会改变(因为数组本身没有改变),因此它不会导致视图重新呈现。删除的版本对象因此在内存中徘徊,因为您有对它的引用,这通常会导致您有趣的崩溃。
AudioData
对象可能应该负责执行版本的删除,完成后,它应该发出更改信号:
objectWillChange.send()
这应该会正确更新您的视图。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。