Получите указатель c IndexPath для значения reloadRow - PullRequest
0 голосов
/ 13 февраля 2020

Сейчас я использую этот код для обновления онлайн-статуса пользователя. Каждый раз, когда статус в сети меняется, весь мой TableView перезагружается:

    // Get and update the actual online stats for the users
    UserApi.shared.getUserOnlineStatus { (onlineStatus) in
        if let user = self.users.first(where: {$0.uid == onlineStatus.keys.first}) {
            let values = onlineStatus.values.first as? Array<Any>
            let onlineStatus = values?[0]
            user.onlineStatus = onlineStatus as? Bool
            }
        self.tableViewUsers.reloadData()
        }
    }

Я не эксперт, но у меня такое чувство, что мне нужно только перезагрузить затронутую строку.

Как можно Я получаю указанный c IndexPath для

self.users.first (где: {$ 0.uid == onlineStatus.keys.first})

, поэтому Я могу просто перезагрузить строку?

Редактировать, рабочий код:

    // Get and update the actual online stats for the users
    UserApi.shared.getUserOnlineStatus { (onlineStatus) in

        if let user = self.users.first(where: {$0.uid == onlineStatus.keys.first}) {
            let values = onlineStatus.values.first as? Array<Any>
            let onlineStatus = values?[0]
            user.onlineStatus = onlineStatus as? Bool
            }

        if let index = self.users.firstIndex(where: {$0.uid == onlineStatus.keys.first}) {
            self.tableViewUsers.reloadRows(at: [IndexPath(row: index, section: 0)], with: .none)
            }
        }
    }

1 Ответ

2 голосов
/ 13 февраля 2020

Try,

        UserApi.shared.getUserOnlineStatus { (onlineStatus) in
            if let user = self.users.first(where: {$0.uid == onlineStatus.keys.first}) {
                let values = onlineStatus.values.first as? Array<Any>
                let onlineStatus = values?[0]
                user.onlineStatus = onlineStatus as? Bool

                if let index = self.users.firstIndex(of: user) {
                    self.tableViewUsers.reloadRows(at: [IndexPath(row: index, section: 0)], with: .automatic)
                }
            }
        }

Сначала необходимо получить индекс измененного пользователя в списке пользователей, а затем перезагрузить строку с этим индексом, используя функцию UITableView [reloadRows(at:with:)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...