视图在更改作为绑定传递的RealmObject时不更新



我有一个视图,其中我有一个RealmObjects数组。当我通过@Binding将它们传递到另一个View并尝试在那里编辑它们时,View不会得到更新。

这是一个简化的例子。当名称更改时,它将正确的名称转储到控制台中,但是View不更新。试图通过更改View.id()来强制重新加载,但这也没有帮助。

class Person: Object, ObjectIdentifiable {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var name: String = ""
}
struct ParentView: View {
@State private var persons: [Person] = []
var body: some View {
ChildView(persons: $persons)
}
}
struct ChildView: View {
@Binding var persons: [Person]
var body: some View {
ForEach(person) { person in
Text(person.name)
.onTapGesture {
person.name = "New Name"
dump(person)
}
}
}
}

一个问题是通过将Realm对象分配给Swift数组来混合两种不同的技术-一般来说,这可能不是最好的主意。

Realm对象是惰性加载的,大量数据集几乎不占用内存。然而,一旦这些对象被强制转换为Swift函数和结构,它们就会全部加载到内存中,并且会使设备不堪重负。

最佳实践是将Realm对象保存在Realm结构中,例如像Results和Lists这样的集合。

回答这个问题:

Realm提供了一个对象@ObservedResults,它是一个属性包装器,当观察到的对象发生变化时,它会使视图失效。例如,如果应用程序有一组People对象的@ObservedResults,如果其中一个发生了变化,关联的视图也会更新。从docs

您可以使用此属性包装器来创建一个视图,该视图自动地当观察到的对象发生变化时自动更新。

那么改变这个

struct ChildView: View {
@Binding var persons: [Person]

struct ChildView: View {
@ObservedResults(Person.self) var persons

我认为剩下的代码可以这样写了。

最新更新