ios - 表刷新使数组项的数量加倍

标签 ios swift uitableview uirefreshcontrol completionhandler

我有来自 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/

相关文章:

ios - UICollectionViewLayout(从 Swift 转换为 Objective-C)

ios - 如何在 swift 中从字节数组创建位图图像

ios - UIAccessibility - 关闭另一个 View 时,将焦点设置到上一个可访问性元素

ios - 如何在 UIView 之外读取 ApplePencil 压力数据?

swift - 当我将 MKCircle 添加到 mapKit 的覆盖层时,编译器中出现了很多警告

ios - 从我在 swift 中使用模态打开的 viewController 访问 navigationController

ios - 将 UIView 从 ViewController 移动到 Window

ios - iOS 中的双向滚动表

ios - UITableView 和 Autolayout 性能不佳

ios - 一个 cellForRowAtIndexPath 中的 3 个不同的 UITableViewCell