【问题标题】:How can I tell when a UITableView has finished reloading itself [duplicate]我如何判断 UITableView 何时完成重新加载自身 [重复]
【发布时间】:2023-03-19 01:05:01
【问题描述】:

调用 tableView.reloadData() 似乎会在不同的线程上启动重新加载。如果我立即尝试选择已添加到数据结构中的单元格,则 TableView 可能尚未重新加载它。有没有办法判断 TableView 何时完成 reloadData() 过程。我的实际代码是:

DispatchQueue.main.async {
        self.tableView.reloadData()
        self.selectNode(node: newNode)
    }

其中 selectNode 是我定位显示该节点的 TableViewCell 的函数。通常,它会失败,因为 TableView 尚未重新显示它。我可以通过插入一个等待循环来“蛮力”解决方案,该循环检查 TableView 自重新加载以来是否请求了我的所有行,但我希望有一个更优雅的解决方案。一般来说,我也对等待循环感到不舒服。

【问题讨论】:

  • 您可能希望在主线程上运行 reloadData(),我认为这是最佳实践 - DispatchQueue.main.async { self.tableView.reloadData() }。这将有助于避免您遇到的竞争条件。
  • reloadData() 在后台线程上不起作用(假设您在主线程上调用它,您应该始终这样做)。通话一返回就完成了;你不需要做任何其他事情。也许您的问题是仅重新加载可见行?见the reference
  • 从我的代码中可以看出,我在主线程上调用它,然后还尝试在主线程上选择一个单元格。我自己管理行选择。我之所以调用 reloadData,是因为我刚刚在表格底部附近添加了一个新项目并想要选择它。 select 方法失败,因为在调用后尚未立即重新加载单元格。所以,凭经验,我不得不说 reloadData 似乎没有在主线程上运行。 tableView cellForRowAt: 中的打印语句确认它在从 reloadData 调用返回后似乎继续良好

标签: ios swift uitableview


【解决方案1】:

我想分享我发现的问题的解决方案,以及它对 tableView.reloadData 工作原理的含义。首先,这是我最终得出的有效代码:

func addNewItem() {
    // here we create the kind of item the user chose

    //ending with this 
    tableView.reloadData()
    queueCheckForDone()
}

func queueCheckForDone() {
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .milliseconds(1), execute: {
        self.checkForDone()
    })
}

func checkForDone() {
    if items[items.count-1].viewCell != nil {     // has last view cell been created
        self.selectItem(item: addedItem)
    } else {
        queueCheckForDone()
    }
}

问题是,在 reloadData 之后,我希望立即选择刚刚添加的单元格。但是,调用后它并没有立即出现,因为 tableView 还没有完成加载。 reloadData 想要在主线程上运行,而我的代码,一个事件处理程序,由于在主线程上而阻塞了它。一旦我放弃线程等待,哪怕是一毫秒,reloadData 就会抓住线程并重新加载整个表(> 250 毫秒)。当我终于再次获得控制权时,我一直在寻找的单元格一直在那里,因此我从未执行过 checkForDone 测试的 else 子句。

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多