我有一个带有自定义布局的大型数据集(> 2000 个项目)的 UICollectionViewController。使用部分,滚动性能变得非常不稳定。使用 Instruments 和一些测试,我确定这是由于在布局中查找 ( layoutAttributesForElementsInRect:
)。我在 中缓存布局属性prepareLayout
,并以我所知道的最快方式在这里查找它们:
[elementsInfo enumerateKeysAndObjectsUsingBlock:^(NSIndexPath *indexPath, UICollectionViewLayoutAttributes *attributes, BOOL *innerStop) {
if (CGRectIntersectsRect(rect, attributes.frame)) [allAttributes addObject:attributes];
}];
我发现大约 25% 的 cpu 时间都花在了枚举上,主要是在[NSIndexPath isEqual:]
. 所以,我需要一种更快的方法来散列这些值。
这一定是可能的,因为我使用相同的数据和分段的 UICollectionViewFlowLayout 进行了交叉测试,并且很顺利。