如何使用自定义单元格大小提高UICollectionView的性能?

时间:2013-08-26 14:03:16

标签: ios objective-c cocoa-touch uicollectionview uicollectionviewcell

当用户输入时,我通过遍历后台线程中的本地字图来检索结果(文本)。每次击键都会取消之前的操作。如果操作完成,则更新数据源并在主线程上调用reloadData。即使返回了数万个结果,这种方法也很有效且速度非常快(用户可以输入的速度很快)。

为了自定义每个集合视图单元的大小,我为UICollectionViewDelegateFlowLayout委托实现了sizeForItemAtIndexPath。不幸的是,当用户输入时,这会导致一个小但明显的延迟。为了确保在我的大小计算逻辑中没有丢失时间,我尝试返回一个固定的大小,但它仍然杀死了性能。我对此感到惊讶,因为在任何给定时间屏幕上只有约120个单元格。在评论此方法时,即使对于非常大的数据集,响应时间也会立即生效。

有关使用自定义单元格大小改进UICollectionView性能的任何想法吗?

由于

补充说明......

程序返回给定字母集中的所有可能单词,然后按分数或按字母顺序排序等。当用户输入时,总字数会快速上升(如果输入多个通配符,则指数级)。在您键入时单词会发生更改,因此单元格的宽度会相应更新并换行到流程布局处理的下一行。

问题似乎是在任何给定时间屏幕上显示的单元格数量。在sizeForItemAtIndexPath中,如果我只返回一个只有一个或两个单元格可见的大尺寸,那么更新速度非常快;但是,如果我返回一个恰好适合文本的大小,我最终会得到100个以上的可见单元格并且存在延迟。如果我注释掉sizeForItemAtIndexPath并且只使用固定大小的单元格,那么它很快,但这不是我想要的。

1 个答案:

答案 0 :(得分:2)

您无需通过致电UICollectionView重新加载reloadData,而是可以使用:

[self.collectionView reloadItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];

此处,indexPath是对应NSIndexPath对象的UICollectionViewCell对象 你想要更新。