为什么tableview数据源没有从Realm Collection观察者更改?

时间:2018-10-10 11:31:31

标签: ios swift database uitableview realm

我有请求进入数据库领域

  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属性后,不会进行任何更改。是观察者的问题吗?

1 个答案:

答案 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()
}