Table 刷新双倍数组项数
Table Refresh doubles number of Array items
我有来自 CloudKit 的静态数据(3 个值),问题是当我 刷新 UITableView
时,我得到 6 个值而不是 3 个值.
我不确定为什么它不刷新并丢弃 Array
中的旧数据,而是保留旧数据并向其中添加相同的数据 Array
。
初始UITableView
设置:
func getData() {
cloud.getCloudKit { (game: [Game]) in
var teamColorArray = [String]()
for item in game {
let itemColor = item.teamColor
teamColorArray.append(itemColor)
print("TCA in: \(teamColorArray)")
}
self.teamColorArray = teamColorArray
self.tableView.reloadData()
}
}
打印:["CC0033"、"FDB927"、"E3263A"]
拉取UIRefreshControl
时刷新数据:
@IBAction func refreshData(_ sender: Any) {
self.teamColorArray.removeAll()
getData()
self.refreshControl?.endRefreshing()
}
打印:["CC0033"、"FDB927"、"E3263A"、"CC0033"、"FDB927"、"E3263A"]
我想我已经缩小到不知何故 game
在函数中 getData()
递增到 6 项。我不确定如果它从 CloudKit
中提取所有新数据,为什么它不会总是保持在 3 个项目,但也许我不明白调用完成处理程序会使值加倍,也许我需要 removeAll
在那里面?我真的不确定
有没有人看到我做错了什么,或者他们会做些什么来修复我的代码?
谢谢!
可能与您对 cloudkit 的异步调用有关。我不太熟悉刷新控制,但这里有一种方法可以解决您的问题并使您的代码更简洁。
func getData(_ completion: () -> ()) {
teamColorArray.removeAll()
cloud.getCloudKit { [weak self] (game: [Game]) in
guard let unwrappedSelf = self else { return }
var updatedColorArray = [String]()
game.forEach { updatedColorArray.append([=10=].teamColor) }
unwrappedSelf.teamColorArray = updatedColorArray
completion()
}
}
现在当您调用 getData 时,它看起来像这样
getData {
DispatchQueue.main.async { [weak self] in
self?.tableView.reloadData()
self?.refreshControl?.endRefreshing()
}
}
你添加 weak self 来消除保留循环的可能性
确保从主线程UI更新
当您知道数组已正确设置时调用 reloadData 和 endRefreshing
我将 teamColorArray.removeAll() 放在 getData 函数中,因为看起来您每次都需要调用它,这样您就不必每次都在函数之前添加它。
我有来自 CloudKit 的静态数据(3 个值),问题是当我 刷新 UITableView
时,我得到 6 个值而不是 3 个值.
我不确定为什么它不刷新并丢弃 Array
中的旧数据,而是保留旧数据并向其中添加相同的数据 Array
。
初始UITableView
设置:
func getData() {
cloud.getCloudKit { (game: [Game]) in
var teamColorArray = [String]()
for item in game {
let itemColor = item.teamColor
teamColorArray.append(itemColor)
print("TCA in: \(teamColorArray)")
}
self.teamColorArray = teamColorArray
self.tableView.reloadData()
}
}
打印:["CC0033"、"FDB927"、"E3263A"]
拉取UIRefreshControl
时刷新数据:
@IBAction func refreshData(_ sender: Any) {
self.teamColorArray.removeAll()
getData()
self.refreshControl?.endRefreshing()
}
打印:["CC0033"、"FDB927"、"E3263A"、"CC0033"、"FDB927"、"E3263A"]
我想我已经缩小到不知何故 game
在函数中 getData()
递增到 6 项。我不确定如果它从 CloudKit
中提取所有新数据,为什么它不会总是保持在 3 个项目,但也许我不明白调用完成处理程序会使值加倍,也许我需要 removeAll
在那里面?我真的不确定
有没有人看到我做错了什么,或者他们会做些什么来修复我的代码?
谢谢!
可能与您对 cloudkit 的异步调用有关。我不太熟悉刷新控制,但这里有一种方法可以解决您的问题并使您的代码更简洁。
func getData(_ completion: () -> ()) {
teamColorArray.removeAll()
cloud.getCloudKit { [weak self] (game: [Game]) in
guard let unwrappedSelf = self else { return }
var updatedColorArray = [String]()
game.forEach { updatedColorArray.append([=10=].teamColor) }
unwrappedSelf.teamColorArray = updatedColorArray
completion()
}
}
现在当您调用 getData 时,它看起来像这样
getData {
DispatchQueue.main.async { [weak self] in
self?.tableView.reloadData()
self?.refreshControl?.endRefreshing()
}
}
你添加 weak self 来消除保留循环的可能性
确保从主线程UI更新
当您知道数组已正确设置时调用 reloadData 和 endRefreshing
我将 teamColorArray.removeAll() 放在 getData 函数中,因为看起来您每次都需要调用它,这样您就不必每次都在函数之前添加它。