SwiftUI 应用程序显示领域更改但不显示新对象
SwiftUI App Shows Realm Changes but Not New Objects
领域 10.7.3,Xcode12.4,macOS 11.2.3
我正在试验 Realm 和 Combine+SwiftUI。当我在 Realm Studio 中更改我的数据时,它们会立即按预期反映在我的应用程序的 UI 中。但是当我 添加 或 删除 一个对象时,我的应用程序 UI 没有改变。
这是我的模型定义:
//--- 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)
}
}
}
}
}
知道为什么我的应用程序不显示 new/deleted 对象而只显示编辑内容吗?如果我重建我的应用程序,则会显示 new/deleted 个对象。
Realm 结果对象是实时更新的对象,始终反映这些对象在 Realm 中的当前状态。
但是,如果您将 Realm Results 对象转换为数组
items = Array(results)
它 'disconnects' 来自 Realm 的那些对象(结果)和它(它们)不再实时更新。
此外,Realm Results 对象是延迟加载的,这意味着它们仅在需要时加载到内存中,因此数千个对象几乎不占用 space。
将它们存储在一个数组中会改变 - 它们 所有 加载到内存中并且可能会淹没设备。
最佳做法是在整个使用过程中将领域集合(结果、列表)保留为该类型的对象,而不是强制转换为数组。
领域 10.7.3,Xcode12.4,macOS 11.2.3
我正在试验 Realm 和 Combine+SwiftUI。当我在 Realm Studio 中更改我的数据时,它们会立即按预期反映在我的应用程序的 UI 中。但是当我 添加 或 删除 一个对象时,我的应用程序 UI 没有改变。
这是我的模型定义:
//--- 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)
}
}
}
}
}
知道为什么我的应用程序不显示 new/deleted 对象而只显示编辑内容吗?如果我重建我的应用程序,则会显示 new/deleted 个对象。
Realm 结果对象是实时更新的对象,始终反映这些对象在 Realm 中的当前状态。
但是,如果您将 Realm Results 对象转换为数组
items = Array(results)
它 'disconnects' 来自 Realm 的那些对象(结果)和它(它们)不再实时更新。
此外,Realm Results 对象是延迟加载的,这意味着它们仅在需要时加载到内存中,因此数千个对象几乎不占用 space。
将它们存储在一个数组中会改变 - 它们 所有 加载到内存中并且可能会淹没设备。
最佳做法是在整个使用过程中将领域集合(结果、列表)保留为该类型的对象,而不是强制转换为数组。