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