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

时间:2016-12-18 16:38:36

标签: ios swift uitableview uirefreshcontrol completionhandler

我有来自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里面的那个?我真的不确定

有没有人看到我做错了什么,或者他们为修复我的代码做了什么?

谢谢!

1 个答案:

答案 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()
  }
}
  • 你添加弱自我以消除保留周期的可能性

  • 确保从主线程

  • 更新UI
  • 当您知道阵列设置正确时,请调用reloadData和endRefreshing

我将teamColorArray.removeAll()放在getData函数中,因为看起来你每次都需要调用它,这样你就不必每次都在函数之前添加它。