使用计时器更新 TableView 中的信息

问题描述 投票:0回答:1

我有一个 UITableView,它显示城市列表以及这些城市的当前时间,我使用计时器对其进行更新。

我开始像这样初始化时间:

clockTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [self] t in
    let myTime = Date().formatted(date: .omitted, time: .standard)

    for i in 0 ..< cities.count {
        let cityGMTDiff = cities[i].gmtDiff
        let overallGMTDiff = cityGMTDiff - myGMTDiff
        let cityTime = Date().addingTimeInterval(Double(overallGMTDiff) * 3600.0).formatted(date: .omitted, time: .standard)
        cities[i].time = cityTime
    }
    citiesTableView.reloadData()
}

我还实现了使用此委托方法删除 TableView 行的功能:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        cities.remove(at: indexPath.row)
        citiesTableView.deleteRows(at: [indexPath], with: .automatic)
    }
}

但是,当我尝试删除一行时,计时器会更新 TableView,从而阻止我完成删除行操作。

我尝试在选择一行后立即使计时器无效,但我怀疑这不是处理此问题的正确方法。

swift uitableview uikit
1个回答
0
投票

显然问题是每 0.5 秒调用一次

reloadData
。这可以防止与表视图的交互很少。

我能想到一些可能的解决方案。

  1. 当计时器触发时,获取可见行的单元格。迭代单元格并告诉每个单元格用当前时间更新自身。这使用的开销要少得多,并且避免使用

    reloadData
    并允许用户滑动以删除行。

  2. 执行标准时钟应用程序在“世界时钟”选项卡上执行的操作。仅允许在编辑模式下删除。在编辑模式下,您不会显示时间,这意味着您在编辑模式下不会调用

    reloadData

© www.soinside.com 2019 - 2024. All rights reserved.