【发布时间】:2021-03-07 13:00:27
【问题描述】:
我有这样一种情况,代码更改了它的 collectionView 数据源,然后多次调用reloadData(),我认为这会导致我的应用程序由于竞争条件而崩溃,因为数据源变化非常快,所以我包装了 sn- p 的代码(更改数据源然后重新加载集合视图)与DispatchQueue.main.async 并且崩溃消失了。
所以这个问题是否有意义并解决了竞争条件,我的理解是用DispatchQueue.main.async 包装这个sn-p 代码在reloadData() 函数完成之前不会再次执行这个sn-p,对吗?
如果您对如何解决此问题有任何其他想法,那就太好了
更新:
例如,如果我们在主线程
上有这段代码self.collectionView.dataSource = self.dataSource
self.collectionView.reloadData()
这个sn-p代码一个接一个地快速调用了两次,所以数据源在第一次重新加载时发生了变化, 作为一种解决方案,我用 async block 包装了这段代码的 sn-p,以确保在第一次重新加载完成之前数据源不会改变。像下面这样:
DispatchQueue.main.async {
self.collectionView.dataSource = self.dataSource
self.collectionView.reloadData()
}
这是否会保证数据源在reloadData() 完成之前不会更改?
【问题讨论】:
标签: swift uicollectionview reloaddata dispatch-queue