微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从上下文中删除后核心数据对象不为零

如何解决从上下文中删除后核心数据对象不为零

我使用的是核心数据,我的设置涉及一个名为 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)
                            } 
                        }
                    }
                }
        }
    }
}

列表视图

List View

删除版本 2

Deleting version 2

显示版本 0,没有文件路径

Shows id 0

版本设置

Version set up

解决方法

当您删除一个版本时,您发布的 trackItems 变量不会改变(因为数组本身没有改变),因此它不会导致视图重新呈现。删除的版本对象因此在内存中徘徊,因为您有对它的引用,这通常会导致您有趣的崩溃。

AudioData 对象可能应该负责执行版本的删除,完成后,它应该发出更改信号:

objectWillChange.send()

这应该会正确更新您的视图。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。