0

我正在尝试在 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 个类似的问题,但它们都以某种方式过时,或者工作但在删除时仍然存在这个问题。

谢谢!

4

2 回答 2

0

领域对象是实时自动更新的,这就是当您尝试保留已删除对象时它们会崩溃的原因。而不是给您的发布主题 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)}
    })
}
}
于 2019-10-26T00:05:07.003 回答
0

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

@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)}
      })
    }
}
于 2020-04-24T21:20:33.367 回答