我有来自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"、"CC0030"、"FDB927"one_answers"E3263A"]
我想我已经把它缩小到函数getData()
中的game
以某种方式递增到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()
}
}
您添加弱self以消除保留周期的可能性
确保从主线程更新UI
当您知道阵列已正确设置时,调用reloadData和endRefreshing
我把teamColorArray.removeAll()放在了getData函数中,因为看起来你每次都需要调用它,这样你就不用每次都在函数之前添加它了。