我有来自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
里面的那个?我真的不确定
有没有人看到我做错了什么,或者他们为修复我的代码做了什么?
谢谢!
答案 0 :(得分:1)
可能与您对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()
}
}
你添加弱自我以消除保留周期的可能性
确保从主线程
当您知道阵列设置正确时,请调用reloadData和endRefreshing
我将teamColorArray.removeAll()放在getData函数中,因为看起来你每次都需要调用它,这样你就不必每次都在函数之前添加它。