gpt4 book ai didi

ios - 使用动画更新 UITableView 时的多线程问题

转载 作者:行者123 更新时间:2023-12-02 04:55:18 24 4
gpt4 key购买 nike

我有一个 View 模型类,它有一个属性(数组),它充当 UITableView 的数据源。

我正在我的虚拟机中执行一些后台任务。它将元素附加到数据源中,并要求我的 View Controller 使用 insertRows 方法更新 TableView 。 VC 正在主队列上对此更新进行排队。

在更新完成之前,另一个后台任务会在数据源中追加一个元素,VM 会要求 VC 在 TableView 中插入一行。

当 VC 尝试插入第一次调用的单元格时,它发现我尝试插入的黑白数据源元素和索引路径不匹配。 (内部一致性异常)并且我的应用程序崩溃了。

如何解决这个问题?提前致谢。

-------------- 编辑:添加代码 ----------

我的VM有一个委托(delegate),VM用它来通知VC。

var dataFields: [FieldVM] = []
weak var delegate: Delegate?

// At some point in code:
while(some_condition) {
DispatchQueue.global().async { [weak self] in
self?.dataFields.append(field)
//Some logic to find indexPaths
self?.delegate.insertFields(at: indexPaths)
}
}

注意:我不能简单地保留变量来存储所有索引路径,然后调用委托(delegate)方法,因为可以从多个位置调用该方法。所以我需要一个通用的解决方案。

我的 VC 已经实现了该协议(protocol),实现了以下方法:

func insertFields(at indexPaths: [IndexPath]) {
DispatchQueue.main.async { [weak self] in
self?.tableView.beginUpdates()
self?.tableView.insertRows(at: indexPaths, with: .bottom)
self?.tableView.endUpdates()
}
}

最佳答案

当尝试通过多个线程访问同一资源并相应地更改或更新 UI 时,这是预期的。

您需要通过在 insertRow 之前添加 beginAnimation 并在该行之后添加 endAnimation 来控制 tableView 中的 insertRow,以保留 UI 过程,请注意,这可能会在更新 UI 时导致一些滞后。

关于ios - 使用动画更新 UITableView 时的多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58833119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com