如何正确地将 RealmDB 结果对象映射到 SwiftUI 列表?
How can I properly map RealmDB Results objects to SwiftUI Lists?
我试图在 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 个类似的问题,但它们都以某种方式过时,或者工作但在删除时仍然有这个问题。
谢谢!
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: [=10=].id, name: [=10=].name, date: [=10=].date)}
})
}
}
我喜欢这种方法!我只是想把它放在那里,因为接受的答案不会编译并且有不止一个问题:
@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: [=14=].id, name: [=14=].name, date: [=14=].date)}
})
}
}
我试图在 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 个类似的问题,但它们都以某种方式过时,或者工作但在删除时仍然有这个问题。
谢谢!
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: [=10=].id, name: [=10=].name, date: [=10=].date)}
})
}
}
我喜欢这种方法!我只是想把它放在那里,因为接受的答案不会编译并且有不止一个问题:
@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: [=14=].id, name: [=14=].name, date: [=14=].date)}
})
}
}