【问题标题】:How can I properly map RealmDB Results objects to SwiftUI Lists?如何正确地将 RealmDB 结果对象映射到 SwiftUI 列表?
【发布时间】: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 个类似的问题,但它们都以某种方式过时,或者工作但在删除时仍然存在这个问题。

谢谢!

【问题讨论】:

    标签: swift swiftui combine swiftui-list realm-database


    【解决方案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)}
          })
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-11
      • 2019-10-29
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多