SwiftUI应用程序显示领域更改,但不显示新对象

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

领域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()
  @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
等功能,但一旦将这些快捷功能应用于集合,它就不再是集合。因此,以领域的方式做事将减少未来的问题,并保持代码更干净。