【发布时间】:2013-08-26 14:03:16
【问题描述】:
当用户键入时,我通过在后台线程中遍历本地单词图来检索结果(文本)。每次击键都会取消之前的操作。如果操作完成,则更新数据源并在主线程上调用 reloadData。即使返回数以万计的结果,这也很有效,而且速度非常快(用户可以键入的速度一样快)。
为了自定义每个集合视图单元格的大小,我为 UICollectionViewDelegateFlowLayout 委托实现了 sizeForItemAtIndexPath。不幸的是,这会导致用户键入时出现很小但明显的延迟。为了确保在我的大小计算逻辑中没有丢失时间,我尝试只返回一个固定大小,但它仍然会影响性能。我对此感到惊讶,因为在任何给定时间,屏幕上只有大约 120 个单元格。当注释掉这个方法时,响应时间又是立即的,即使对于非常大的数据集也是如此。
对于使用自定义单元格大小提高 UICollectionView 的性能有什么想法吗?
谢谢
补充说明...
程序从给定的字母集中返回所有可能的单词,然后按分数或字母顺序等排序。当用户键入时,总字数会快速增加(如果输入了多个通配符,则呈指数增长)。输入时单词会发生变化,因此单元格的宽度会相应更新,并按照流程布局处理换行到下一行。
问题似乎是在任何给定时间屏幕上显示的单元格数量。在 sizeForItemAtIndexPath 中,如果我只是返回一个大尺寸,其中只有一两个单元格可见,则更新非常快;但是,如果我返回一个刚好适合文本的大小,我最终会得到 100 多个可见单元格并且会有延迟。如果我注释掉 sizeForItemAtIndexPath 并只使用固定大小的单元格,它会很快,但这不是我想要的。
【问题讨论】:
-
您是希望单元格在输入过程中改变大小,还是只具有固定的自定义大小?
-
试图了解您为什么要调用
reloadData而不仅仅是更新屏幕上的单元格。 -
上面添加的附加说明...单元格的宽度随着用户键入而变化。如果不调用 reloadData,我该怎么做?
-
我目前的理论是你正在导致整个布局重排,如果你有足够的(数万个)项目,这可能需要很长时间。可能是由于某些布局优化,您说它快速的两种情况(固定尺寸和大尺寸)没有重排整个事情。您是否尝试过将结果集限制为 100 个项目?
-
另外,您可以尝试分析它吗?你在使用自动布局吗?
标签: ios objective-c cocoa-touch uicollectionview uicollectionviewcell