swift 核心数据:如何更新关系中的实体?

9ceoxa92  于 2023-01-16  发布在  Swift
关注(0)|答案(1)|浏览(186)

我知道您可以观察到使用@ObservedObject获取的实体的变化。
这个问题最好用一个例子来说明:如果我有一个实体学校,与学生有一对多的关系,并且每个学生都有一个属性numberOfPencils,那么每当学校中的一个学生改变他的numberOfPencils属性时,我想重新计算学校中所有铅笔的总和。
如果我通过schools实体(是一个@ObservedObject)访问所有学生,那么只有在添加了新学生时,我才能得到对总和的更新,而在现有学生更改其numberOfPencils时,我就不会得到更新,因为据我所知,只能逐个观察学生对象。
我能想到的唯一方法是设置一个带有fetchRequestPredicate的NSFetchedResultsControllerDelegate,通过唯一标识学校的keyPath从学生到学校获取与学校关联的所有学生,但这似乎是一个很糟糕的方法,肯定有更好的解决方案,但我一直没有找到。
基本上,我想得到通知的变化,任何学生与学校。

yhived7q

yhived7q1#

派生属性无疑是一个很好的方法。
但澄清一下:@ObservedObject也可以在项目更改时更新。您只需使用objectWillChange.send()手动触发更新
假设您的School单元格如下所示:

struct SchoolCell: View {
    
    @ObservedObject var school: School

    var body: some View {
        HStack {
            let pencils = school.pupilsArray.reduce(0, {$0 + $1.numberOfPencils})
            Text(school.name)
            Spacer()
            Text(verbatim: "\(pencils) pencils")
                .foregroundColor(.secondary)
        }
    }
}

那么Pupil修改将像这样工作:

// ...
    @ObservedObject var school: School
// ...
    Button("+10 Pencils") {
        school.objectWillChange.send()
        pupil.numberOfPencils += 10
        try? viewContext.save()
    }

尽管SchoolCell是一个自己的结构体,但这一点很重要,因此当它的@ObservedObject学校发生变化时,它会被刷新。

相关问题