【发布时间】:2021-02-05 00:37:21
【问题描述】:
我正在尝试this quick start for SwiftUI and Combine,以尝试了解如何将我的 Realm 数据库连接到 Combine。
该示例观察到RealmSwift.List 并保留一个填充了其数据的表。这是一个指向子类的链表。我想知道如何观察 Results 集合,以便跟踪整个 Realm 类的任何更改。
例如,假设我有一个Workspace 类:
class Workspace: Object, ObjectKeyIdentifiable{
@objc dynamic var id = UUID().uuidString
@objc dynamic var name = ""
@objc dynamic var archived = false
}
在状态对象中,我可以像这样设置一个Results<Workspace>变量:
class AppState: ObservableObject {
@Published var workspaces: Results<Workspace>?
var cancellables = Set<AnyCancellable>()
init(){
let realmPublisher = PassthroughSubject<Realm, Error>()
realmPublisher
.sink(receiveCompletion: { _ in }, receiveValue: { realm in
//Get the Results
self.workspaces = realm.objects(Workspace.self)
})
.store(in: &cancellables)
realmPublisher.send(try! Realm())
return
}
}
但是当需要观察对象时,我不能,因为Results 不是对象(我假设)。
struct ContentView: App {
@ObservedObject var state = AppState()
var view: some View {
ItemsView(workspaces: state.workspaces!)
}
var body: some Scene {
WindowGroup {
view.environmentObject(state)
}
}
}
struct ItemsView: View {
@ObservedObject var workspaces: Results<Workspace> //<!-- Error
var body: some View {
//...
}
}
Xcode 在workspaces 属性上给出语法错误:
属性类型“Results”与其包装类型“ObservedObject”的“wrappedValue”属性不匹配
是否可以观察一组Results,就像我们可以在Results 的集合上设置一个通知监听器一样?
【问题讨论】: