为 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 自定义布局。不显示或查询补充视图

每个部分的 UICollectionView 布局

Swift:如何在设备旋转后刷新UICollectionView布局

UICollectionView 单元格布局超出了集合视图的范围

Swift 中的 UICollectionView 自定义布局

iOS核心笔记——UICollectionView-布局对象