使用动画更新UITableView中的多线程问题

我有一个View Model类,该类具有一个属性(数组),该属性用作UITableView的数据源。

我正在VM中执行一些后台任务。它将元素添加到数据源中,并要求我的View Controller使用insertRows方法更新表视图。 VC在主队列上排队此更新。

在更新完成之前,另一个后台任务将在数据源中添加一个元素,并且VM要求VC在tableview中插入一行。

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

如何解决此问题?预先感谢。

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

我的VM有一个委托,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)
    }
}

注意:我不能简单地保留变量以存储所有indexPath,然后再调用委托方法,因为可以从多个位置调用此方法。所以我需要一个通用的解决方案。

我的VC已实现了该协议,并实现了以下方法:

func insertFields(at indexPaths: [IndexPath]) {
    DispatchQueue.main.async { [weak self] in
        self?.tableView.beginUpdates()
        self?.tableView.insertRows(at: indexPaths,with: .bottom)
        self?.tableView.endUpdates()
    }
}
dongbiao1 回答:使用动画更新UITableView中的多线程问题

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

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

本文链接:https://www.f2er.com/3111739.html

大家都在问