SwiftUI应用程序显示领域更改,但不显示新对象
领域10.7.3,Xcode 12.4,macOS 11.2.3 我正在试验Realm和Combine+SwiftUI。当我在Realm Studio中对数据进行更改时,它们会像预期的那样立即反映在我的应用程序的UI中。但是当我添加或删除对象时,我的应用程序界面不会改变 以下是我的模型定义:SwiftUI应用程序显示领域更改,但不显示新对象,swiftui,realm,combine,Swiftui,Realm,Combine,领域10.7.3,Xcode 12.4,macOS 11.2.3 我正在试验Realm和Combine+SwiftUI。当我在Realm Studio中对数据进行更改时,它们会像预期的那样立即反映在我的应用程序的UI中。但是当我添加或删除对象时,我的应用程序界面不会改变 以下是我的模型定义: //--- Model --- class Item: Object, ObjectKeyIdentifiable { @objc dynamic var _id = ObjectId.generate
//--- Model ---
class Item: Object, ObjectKeyIdentifiable {
@objc dynamic var _id = ObjectId.generate()
@objc dynamic var text = ""
}
这是我的视图模型:
//--- View Model ---
class ItemModel: ObservableObject {
static let shared = ItemModel()
var token: NotificationToken? = nil
@Published var items = [Item]()
init(){
let realm = try! Realm()
let results = realm.objects(Item.self)
items = Array(results)
token = results.observe { [weak self] _ in
print("-- updated --")
self?.objectWillChange.send()
}
}
deinit{
token?.invalidate()
}
}
最后,这里是我的SwiftUI视图:
//--- View ---
struct ItemView: View {
@StateObject private var model = ItemModel.shared
var body: some View {
ScrollView{
VStack(spacing: 7){
ForEach(model.items, id: \._id) { item in
Text(item.text)
}
}
}
}
}
你知道为什么我的应用程序不会显示新的/删除的对象而只显示编辑吗?如果我重建我的应用程序,将显示新的/删除的对象。领域结果对象是实时更新对象,并且始终反映领域中这些对象的当前状态 但是,如果将领域结果对象强制转换为数组
items = Array(results)
它将这些对象与领域“断开”连接,它们不再是实时更新
此外,领域结果对象是延迟加载的,这意味着它们只在需要时加载到内存中,因此数千个对象几乎不占用任何空间
将它们存储在一个数组中会改变这一点——它们都被加载到内存中,可能会淹没设备
最佳做法是在使用领域集合(结果、列表)的整个过程中将它们保留为该类型的对象,而不是强制转换为数组。事实证明,这比我预期的要简单得多。这对于对象延迟加载是有意义的。我不确定域
结果
对象是否可以设置为@Published
,因此我从数组开始。@CliftonLabrum这是一个常见问题。尽可能保持结果和列表的纯粹性。很容易使用.map
或swift.filter
等功能,但一旦将这些快捷功能应用于集合,它就不再是集合。因此,以领域的方式做事将减少未来的问题,并保持代码更干净。