- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到这样一种情况,代码更改其 collectionView 数据源,然后多次调用 reloadData()
,我认为这会导致我的应用程序因竞争条件而崩溃,因为数据源变化非常快,所以我用 DispatchQueue.main.async
包装了一段代码(更改数据源然后重新加载 Collection View )并且崩溃消失了。所以这个问题是否有意义并解决了竞争条件,我的理解是用 DispatchQueue.main.async
包装这段代码将不会再次执行此代码段,直到 reloadData() 函数完成,是对吗?如果您对如何解决此问题有任何其他想法,那就太好了
更新:
例如,如果我们在主线程
上有这段代码self.collectionView.dataSource = self.dataSource
self.collectionView.reloadData()
这段代码快速地接连调用了两次,因此在第一次重新加载时数据源发生了变化,作为解决方案,我用async block 包装了这段代码,以确保在第一次重新加载完成之前数据源不会更改。像下面这样:
DispatchQueue.main.async {
self.collectionView.dataSource = self.dataSource
self.collectionView.reloadData()
}
这是否可以保证在 reloadData()
完成之前数据源不会更改?
最佳答案
reloadData
应始终 在主线程上调用。如果您不这样做,那就是崩溃。
好的,但现在我们来谈谈数据的更改和对 reloadData
的调用是如何耦合的。也许你有这样的情况:
background queue:
=================
<networking>
update the data
main queue:
===========
reloadData
您仍然会遇到麻烦,因为尽管对主队列的两次调用不能重叠,但对后台队列的两次调用可以重叠,因为它可能是并发队列。这就是你的比赛条件;数据的更新和数据的重新加载是解耦的。请记住,在重新加载数据期间调用了多个数据源方法,因此它们都需要查看相同数据,否则如果数据不一致,您确实会因某种不一致问题而崩溃调用之间的变化。有了这种架构,这是一个非常现实的可能性。
但是如果后台队列是一个串行队列,并且如果到主队列的步骤是从那个串行队列开始的,那么这种重叠至少是不可能的。所以这将是一个更安全的解决方案:
background queue:
=================
<networking>
single background *serial* queue:
=================================
update the data
main queue:
===========
reloadData
尽管如此,我们仍处于“共享数据”状态。危险依然存在。没有什么可以阻止数据与所有这些同时被触及一些其他队列。为防止这种情况发生,您需要围绕对数据的每次 访问编写代码,确保访问只发生在一个队列上。毕竟,您的数据结构本身可能不是线程安全的!但是我们已经知道数据源方法将只在主线程上看到数据,因为这就是 reloadData
的工作方式。所以最简单的方法就是制定一个规则,每次对数据的访问都发生在主队列上:
background queue:
=================
<networking>
main queue:
===========
update the data
reloadData
因此,总而言之,如果这就是您现在正在做的事情,那么这是正确的做法。
关于swift - 主线程和 Collectionview.reloadData(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64991690/
我在 Storyboard 中有一个 collectionView,如下所示: 注意约束:Collection View.top = Search Bar.bottom 我不想要该行上方的 Colle
我有一个包含两个部分的 Collection View ,每个部分都有一个项目。部分中的单元格包含 Collection View ,我需要使高度单元格适合内容 Collection View 。 我
我见过将 Collection View 嵌套在 TableView 中的解决方案,但对于我的应用程序,我需要有 2 个 Collection View ,因为这样可以更轻松地执行其他操作。 因此,让
感谢帮助。 如上所示,CollectionView ItemSize.height 比 CollectionView.height 大。我只是在 viewDidLayoutSubviews() 中设置
我有一个collectionview(A),它可以作为“卡片 View ”来滑动。在最后一个卡/单元格中,我有另一个 Collection View (B)来显示更多单元格。到目前为止,一切都很好!一
我正在寻找一种方法,当您滚动到 collectionView 中的另一个单元格时,可以更改 imageView 中的图像。 因此,当滚动单元格的 (1) 时,我想更改图像 (2)。 创建此内容的最佳方
我的 NSCollectionView 项目集成了另一个 NSCollectionView。一切都很好,但在第一个 View 中选择项目时就不行了。 当我设置collectionView1.isSel
我是一名 Android 开发者,正在尝试学习 iO 开发。 我正在尝试在水平分页滚动器内实现垂直滚动 UI(就像 ViewPager 内的 RecyclerView)。 我知道我应该使用嵌套的 UI
我在collectionView中有一个collectionView,我希望能够选择第二个collectionView中的一个单元格来执行到另一个ViewController的segue。 目前,当我
我有这两个代表: #pragma mark = UICollectionViewDataSource - (NSInteger)collectionView:(UICollectionView*)co
嘿,我正在尝试在我的动态 Collection View 单元格之后添加一个静态 Collection View 单元格。例如在我的屏幕截图中,在“Study Grind Edition” Colle
是否可以通过在 Collection View Cell .swift 文件中编写代码来阻止我的 Collection View 滚动。我希望能够在用户点击单元格中的按钮时停止滚动,然后在再次按下按钮
我有一个用例,我想要呈现一组collectionViews(或复合 View )。使用 marionette.js 执行此操作的最佳方法是什么? 我的模型结构如下- A | |-- Collectio
我有一个 View Controller ,其中有 tableView 和 Collection View 。我为 collectionView 和 tableView 设置了相同的高度。 前半部分是
在 Visual Studio 2017 中,尝试存档 Xamarin Android 项目时,成功构建后出现以下错误: 无法创建应用程序存档“MyArchive”。这种类型的 CollectionV
我对 Collection View 完全陌生,请帮助我在 Collection View 中垂直和水平滚动单元格: viewcontroller.h #import @interface View
我在一个表格 View 单元格中有两个不同的 collectionView。原因是因为我试图找到实现一个水平 collectionView 和一个显示不同数据的垂直 collecitonView 的最
我想在另一个 collectionview 标题中实现一个 Collection View 幻灯片,但是当我尝试连接 uicollectionview 的导出时,我收到一条错误消息,指出导出无法连接到
您好,我已经为这个问题苦苦挣扎了一段时间,一直想不出来。 我想做的是,在 collectionview 单元格内按下一个按钮,然后执行到下一个单元格的转换。 这是我想在 collectionview
在 collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayo
我是一名优秀的程序员,十分优秀!