UICollectionView重新应用大数据量快照耗时过长的优化咨询
UICollectionView横竖屏切换快照优化问题
我维护的UICollectionView包含30000+条数据,屏幕横竖屏切换时数据源会发生变化,因此每次旋转都需要重新创建并应用新的快照。
实际运行中发现,首次加载单元格时速度尚可,但横竖屏切换后重新应用新快照的耗时极长——核心原因是重载时需要计算新旧快照的差异,消耗了大量资源。
我想知道:
- 是否存在无需计算差异即可应用快照的方法?(由于快照体积大,不想在内存中保留两份快照)
- 先应用空快照再应用完整快照是否是可行的解决方案?
补充测试数据
我做了两组粗略测试,结果如下:
应用空快照的情况
首次加载
2022-08-05 07:47:11.666847+1000 before apply 2022-08-05 07:47:11.667139+1000 after apply empty snapshot 2022-08-05 07:47:11.788821+1000 after creating full-sized snapshot 2022-08-05 07:47:13.022973+1000 after applying full-sized snapshot
总耗时:~1.36秒
旋转后重载
2022-08-05 07:48:05.238174+1000 before apply 2022-08-05 07:48:08.708084+1000 after apply empty snapshot 2022-08-05 07:48:08.900322+1000 after creating full-sized snapshot 2022-08-05 07:48:12.034542+1000 after applying full-sized snapshot
总耗时:~6.80秒
不应用空快照的情况
首次加载
2022-08-05 07:49:33.149233+1000 Setting columns… 2022-08-05 07:49:33.279147+1000 before apply 2022-08-05 07:49:33.401114+1000 after creating full-sized snapshot 2022-08-05 07:49:34.402645+1000 after applying full-sized snapshot
总耗时:~1.25秒
旋转后重载
2022-08-05 07:50:26.829309+1000 Reload due to trait collection change… 2022-08-05 07:50:27.270996+1000 Setting columns… 2022-08-05 07:50:31.187630+1000 before apply 2022-08-05 07:50:31.410154+1000 after creating full-sized snapshot 2022-08-05 07:50:45.879088+1000 after applying full-sized snapshot
总耗时:~19.05秒
测试结论
- 首次加载:不使用空快照的速度更快(1.25秒 vs 1.36秒)
- 横竖屏切换后重载:先应用空快照再应用完整快照的耗时远低于直接应用完整快照,核心是节省了新旧完整快照的差异计算时间
当前疑问
是否存在比「先空快照再完整快照」更高效的优化方案?如果没有,我可能需要回退到旧的UICollectionViewDataSource方式实现数据源供给。
内容的提问来源于stack exchange,提问作者Heuristic
相关产品推荐
相关产品推荐

