一、问题描述
1、起源:项目中一个页面中的UICollectionView拥有数千数据源,为了节约系统性能,采用以下刷新方式
self.collection.reloadItems(at: self.collection.indexPathsForVisibleItems)
2、现象:有不确定数目的cell直接忽略了cell重置方法导致显示异常
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {}
二、原因描述
在iOS10中,苹果为UICollectionViewCell引入了Pre-Fetching预加载机制用于提升它的性能。Pre-Fetching中的isPrefetchingEnabled默认开启,预加载的indexPaths数量不定,由滑动状态确定。未能刷新Pre-Fetching中的cell为此次事件的问题。
三、解决方案
出于性能考虑我们坚持刷新局部cells,实现UICollectionViewDataSourcePrefetching代理,并记录当前确定的indexPaths存储
self.collection.reloadItems(at: self.collection.indexPathsForVisibleItems+preIndexPaths)
四、进一步
官方文档中提示开启Pre-Fetching会开始导致代理"cellForItemAt"请求超过常规需要展示的数量,请使用代理“willDisplay”更新视图操作
突然吐槽一下 既然优化这么牛批 为啥还是个果冻屏(气哭了)
五、链接