我有来自 CloudKit 的静态数据(3 个值),问题是当我刷新 UITableView
时,我得到 6 个值而不是 3 个值。。 p>
我不确定为什么它不刷新并丢弃 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($0.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 函数中,因为您似乎每次都需要调用它,这样您就不必每次都在函数之前添加它。
关于ios - 表刷新使数组项的数量加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41210518/