我有一个View Model类,它有一个属性(数组(,用作UITableView的数据源。
我正在VM中执行一些后台任务。它将元素附加到数据源中,并要求我的视图控制器使用insertRows
方法更新表视图。VC正在主队列上排队进行此更新。
在更新完成之前,另一个后台任务在数据源中添加一个元素,VM要求VC在表视图中插入一行。
当VC试图为第一次调用插入单元格时,它发现我试图插入的b/w数据源元素和indexPaths不匹配。(内部一致性异常(,我的应用程序崩溃。
如何解决此问题?提前谢谢。
--------------编辑:添加代码---------------
我的虚拟机有一个委托,由虚拟机用来通知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)
}
}
注意:我不能简单地保留变量来存储所有indexPaths,然后调用委托方法,因为这个方法可以从多个地方调用。所以我需要一个通用的解决方案
我的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()
}
}
当尝试由多个线程访问同一资源并相应地更改或更新UI时,会出现这种情况。
您需要通过在insertRow之前添加beginAnimation,在行之后添加endAnimation来控制表中的insertRowView,以保留UI进程,请注意,这可能会在更新UI时造成一些滞后。