我有请求进入数据库领域
func allContacts() -> Results<RMContact> {
let realm = self.encryptedRealm()
return realm!.objects(RMContact.self).sorted(byKeyPath: "lastActive", ascending: false)
}
以及演示者的代码
DispatchQueue.main.async {
let contacts = RMContactsManager.shared.allContacts()
self.notificationToken = contacts.observe { [weak self] (changes: RealmCollectionChange) in
guard let tableView = self?.view.tableView else { return }
switch changes {
case .initial:
UIView.performWithoutAnimation {
tableView.reloadData()
}
case .update(_, let deletions, let insertions, let modifications):
UIView.performWithoutAnimation {
tableView.beginUpdates()
tableView.insertRows(at: insertions.map({ IndexPath(row: $0, section: 0) }), with: .automatic)
tableView.deleteRows(at: deletions.map({ IndexPath(row: $0, section: 0)}), with: .automatic)
tableView.reloadRows(at: modifications.map({ IndexPath(row: $0, section: 0) }), with: .automatic)
tableView.endUpdates()
}
case .error(let error):
fatalError("\(error)")
}
}
}
在表视图中设置新的lastActive值序列后,未更改 首次排序实际上是针对控制器的,但是在将新值设置为lastActive属性后,不会进行任何更改。是观察者的问题吗?
答案 0 :(得分:0)
问题似乎是您在插入,删除和修改方面正在发生变化。
如果先执行插入然后删除操作(这是您现在正在做的事情),它将插入新值,并且数据源将被修改,因此现在删除行时将是不正确的。
同样,在对数组进行排序的情况下,通常将替换两个元素,删除一个元素,并添加另一个元素。
所以可以解决您的问题的方法是,先删除然后再插入。像这样:
UIView.performWithoutAnimation {
tableView.beginUpdates()
tableView.deleteRows(at: deletions.map({ IndexPath(row: $0, section: 0)}), with: .automatic)
tableView.insertRows(at: insertions.map({ IndexPath(row: $0, section: 0) }), with: .automatic)
tableView.reloadRows(at: modifications.map({ IndexPath(row: $0, section: 0) }), with: .automatic)
tableView.endUpdates()
}