为 reloadRow 的值获取特定的 IndexPath

Get a specific IndexPath for a value to reloadRow

现在,我正在使用此代码来更新用户的在线状态。每次在线状态改变时,我的整个 TableView 都会重新加载:

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

我不是专家,但我觉得我应该只重新加载受影响的行。

如何获取

的特定 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: {[=11=].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: {[=11=].uid == onlineStatus.keys.first}) {
            self.tableViewUsers.reloadRows(at: [IndexPath(row: index, section: 0)], with: .none)
            }
        }
    }

试试,

        UserApi.shared.getUserOnlineStatus { (onlineStatus) in
            if let user = self.users.first(where: {[=10=].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:)]