Почему источник данных tableview не меняется от наблюдателя Realm Collection? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть запрос к базе данных области

  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 голосов
/ 10 октября 2018

Кажется, проблема в том, что вы получаете изменения в плане вставок, удалений и модификаций.

Если вы сначала выполните вставку, а затем удаление (это то, что вы делаете прямо сейчас),Он будет вставлять новые значения, и источник данных будет изменен, поэтому теперь, когда вы удаляете строки, это не будет правильно.

Также в вашем случае, когда вы сортируете массив, обычно заменяются два элемента,один удаляется, а другой будет добавлен.

Итак, что может решить вашу проблему, сначала удалите, а затем вставьте.Как это:

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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...