如何正确地将 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 容器中的哪些数据能够正确地将其映射为卷
如何正确地将对象 $push 到 MongoDB 模式属性中,类型:数组
如何使用 React Hooks 和 Context API 正确地将来自 useEffect 内部调用的多个端点的数据添加到状态对象?