如果我在Realm模型let book = List<Book>()
中具有属性,则其更改不会更新视图。
我认为是因为领域模型是类。
关于解决此问题的任何想法
final class Book: Object, ObjectKeyIdentifable {
@objc dynamic var id: String = ""
@objc dynamic var title: String = ""
@objc dynamic var subTitle: String = ""
override class func primaryKey() -> String? {
return "id"
}
}
final class Author: Object, ObjectKeyIdentifable {
@objc dynamic var id: String = ""
@objc dynamic var name: String = ""
let book = List<Book>()
override class func primaryKey() -> String? {
return "id"
}
}
class Store: ObservableObject {
@Published var Authors: Results<Author>?
private var subscriptions = Set<AnyCancellable>()
init() {
let realm = try! Realm()
realm.objects(Author.self)
.changesetPublisher
.sink { changeset in
self.applyChangeset(changeset)
}
.store(in: &subscriptions)
}
func applyChangeset(_ changes: RealmCollectionChange<Results<Author>>) {
switch changes {
case .initial(let results):
self.Authors = results
case .update(let results, deletions: _, insertions: _, modifications: _):
self.Authors = results
case .error(let error):
print(error.localizedDescription)
}
}
}
尝试在主队列上分派,为
realm.objects(Author.self)
.receive(on: DispatchQueue.main) // << here !!
.changesetPublisher
.sink { [weak self] changeset in
self?.applyChangeset(changeset) // avoid cross reference
}
并显式通知更改,因为您使用的是引用类型的模型,因此更改内部结构不会更改引用本身...所以
func applyChangeset(_ changes: RealmCollectionChange<Results<Author>>) {
switch changes {
case .initial(let results):
self.Authors = results
case .update(let results, deletions: _, insertions: _, modifications: _):
self.Authors = results
// let assume we consider this case, then
self.objectWillChange.send() // << this !!
case .error(let error):
print(error.localizedDescription)
}
}