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。

将它们存储在一个数组中会改变 - 它们 所有 加载到内存中并且可能会淹没设备。

最佳做法是在整个使用过程中将领域集合(结果、列表)保留为该类型的对象,而不是强制转换为数组。