为 UICollectionView 布局散列一个非常大的数据集的最快方法是啥... NSIndexPath 太慢了
Posted
技术标签:
【中文标题】为 UICollectionView 布局散列一个非常大的数据集的最快方法是啥... NSIndexPath 太慢了【英文标题】:What's the fastest way to hash a very large dataset for UICollectionView Layout...NSIndexPath is too slow为 UICollectionView 布局散列一个非常大的数据集的最快方法是什么... NSIndexPath 太慢了 【发布时间】:2013-02-03 00:33:38 【问题描述】:我有一个带有自定义布局的大型数据集(>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 进行了交叉测试,结果很顺利。
【问题讨论】:
【参考方案1】:嗯,结果是使用数组而不是字典,并且通过 NSPredicate 进行过滤要快得多,因为在这种情况下,索引是已知的。
【讨论】:
同意 - 我有一个包含 3,600 个视图的大网格来排序。从 NSDictionary 切换到 NSArray 将我的枚举时间从几秒缩短到几毫秒。以上是关于为 UICollectionView 布局散列一个非常大的数据集的最快方法是啥... NSIndexPath 太慢了的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView 自定义布局。不显示或查询补充视图
Swift:如何在设备旋转后刷新UICollectionView布局
UICollectionView 单元格布局超出了集合视图的范围