如何正确地将 RealmDB 结果对象映射到 SwiftUI 列表?

Posted

技术标签:

【中文标题】如何正确地将 RealmDB 结果对象映射到 SwiftUI 列表?【英文标题】:How can I properly map RealmDB Results objects to SwiftUI Lists? 【发布时间】:2019-10-25 20:06:53 【问题描述】:

我正在尝试在 SwiftUI 列表中显示 realmdb 查询的结果,但在删除数据库对象时遇到了问题。

我正在尝试使用这样的东西:

final class DBData: ObservableObject

let didChange = PassthroughSubject<DBData, Never>()

private var notificationTokens: [NotificationToken] = []
var events = try! Realm().objects(ADMEvent.self)
@Published var events: [ADMEvent] = []
init() 
    // Observe changes in the underlying model
    self.notificationTokens.append(posts.observe  _ in
        self.events = Array(self.posts)
        self.didChange.send(self)
    )


如果我在列表中显示项目但当我使用 realm.deleteAll() 时应用程序崩溃,因为看起来 Swift UI 的列表实现正在尝试区分列表,访问现在无效的领域数据库对象。

关于堆栈溢出有 3 或 4 个类似的问题,但它们都以某种方式过时,或者工作但在删除时仍然存在这个问题。

谢谢!

【问题讨论】:

【参考方案1】:

Realm 对象是实时自动更新的,这就是当您尝试保留已删除对象时它们会崩溃的原因。而不是给你的发布主题 Realm.Object 将它映射到一个结构,该结构只有你需要使用的字段并使用该数组来驱动 SwiftUI。

struct Event: Identifiable 
  var id: String
  var name: String
  var date: Date


final class DBData: ObservableObject 
private var notificationTokens: [NotificationToken] = []
var events = try! Realm().objects(ADMEvent.self)
@Published var publishedEvents: [ADMEvent] = []
init() 
    // Observe changes in the underlying model
    self.notificationTokens.append(posts.observe  _ in
        self.publishedEvents = events.map  Event(id: $0.id, name: $0.name, date: $0.date)
    )


【讨论】:

好主意!谢谢。 @Micheal - posts.observe 指的是什么?如果你得到这个工作,你能发布更完整的解决方案吗?【参考方案2】:

我喜欢这种方法!我只是想把它放在那里,因为接受的答案不会编译并且有多个问题:

@Published var publishedEvents: [ADMEvent] = []

应该是:

@Published var publishedEvents: [Event] = []

 self.notificationTokens.append(posts.observe  _ in

应该是:

 self.notificationTokens.append(events.observe  _ in

所以

final class DBData: ObservableObject 
    private var notificationTokens: [NotificationToken] = []
    var events = try! Realm().objects(ADMEvent.self)
    @Published var publishedEvents: [Event] = []

    init() 
      // Observe changes in the underlying model
      self.notificationTokens.append(events.observe  _ in
        self.publishedEvents = events.map  Event(id: $0.id, name: $0.name, date: $0.date)
      )
    

【讨论】:

以上是关于如何正确地将 RealmDB 结果对象映射到 SwiftUI 列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道 docker 容器中的哪些数据能够正确地将其映射为卷

如何正确地将对象/指针存储到 Qlist 中

如何正确地将对象 $push 到 MongoDB 模式属性中,类型:数组

如何使用 React Hooks 和 Context API 正确地将来自 useEffect 内部调用的多个端点的数据添加到状态对象?

如何使用 jquery ajax 正确地将 json 对象传递给烧瓶服务器

如何正确地将日期时间从 c# 传递到 sql?