GCD在UICollectionView上的强大功能滚动

所以我从最近2年开始使用objC,从最近4个月开始使用Swift 3。 因为这是我的第一个博客,所以这个问题对我来说很难解决。 在尝试了多个stackOverFlow线程之后,在搜索了数百篇博客之后,我终于找到了解决方案。 就是这样

问题:

考虑一个具有UICollectionView作为情节提要的IBOutlet的视图控制器。 它将解析后的JSON响应对象用作数据源数组。

因此JSON结构非常庞大,就像我们的数据源一样。 看一下下面的UI截图:

所以UICollectionView具有问题和答案的结构,因为标题显示了问题,而单元格是可用于相应答案的多个答案。 单元格包含一个UIImageView和UILabel作为描述。 用户必须至少选择一个单元格作为一个问题的答案,否则,UICollectionView将滚动到特定的索引单元格。

为了存储选定的答案,我为选定的索引维护了[[IndexPath]]。 这样我就可以知道用户选择了哪个值,并将此数组用于cellForItem以显示所选答案。

滚动到特定索引单元格的代码:

现在,最关键的部分是我花了很多天来弄清楚的。 在单击下一个按钮时,UICollectionView应该可以平滑滚动到相应的索引单元,但是在滚动时会被切碎。 我不得不点按两次按钮三下才能到达该特定的索引单元格。

调试:

所以,首先我可能是因为分层。 因为我是CALayer
所选单元格接壤以突出显示特定单元格。 但是即使去除分层后,问题仍然存在。

其次,我认为这一定是有可能发生的,因为我没有正确地缓存图像 ,所以一定是因为这个原因,但是即使在调试代码后,我仍然知道这不是问题,这是不同的。

花了很多时间后,我有了使用XCode的工具来了解问题的想法。 因此,使用仪器后,我开始获得清晰的图像。 当我单击按钮进行验证时,我的应用程序没有足够的内存。 即我的整个主线程因执行该特定任务而被阻塞。 当我在主线程上进行分层,图像下载以及UICollectionView的滚动时,主线程被100%的workLoad使用。

解:

因此,为了解决这个问题,我创建了一个VC中的另一个线程,在我的viewDidLoad 中将 QoS指定为.userInteractive

因此,上面的代码所做的只是创建另一个线程并从主线程共享工作负载,以便更好地响应主线程。 现在,主线程只有两个任务可以执行:渲染边框和显示图像。 当我们使用此scrollDispatchQueue滚动到相应的索引时,单击下一步按钮时,现在不会出现UICollectionView滚动的斩波。

在解决这个问题的过程中,我非常想解决这个问题,但是现在终于解决了,并且知道我们可以使用GCD在多线程中发挥什么作用。 所以希望这个博客能在以后迅速帮助像我这样的新手3 3

因为这是我的第一个博客,请忽略是否有错字。 欢迎对此发表评论或提供任何帮助,或针对相应问题提出其他建议。 真的很高兴知道。

感谢您的阅读,祝您编程愉快。

Interesting Posts