表刷新使数组项的数量增加一倍



我有来自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函数中,因为看起来你每次都需要调用它,这样你就不用每次都在函数之前添加它了。

最新更新