【问题标题】:How to improve performance of UICollectionView with custom cell sizes?如何使用自定义单元格大小提高 UICollectionView 的性能?
【发布时间】:2013-08-26 14:03:16
【问题描述】:

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

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

对于使用自定义单元格大小提高 UICollectionView 的性能有什么想法吗?

谢谢

补充说明...

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

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

【问题讨论】:

  • 您是希望单元格在输入过程中改变大小,还是只具有固定的自定义大小?
  • 试图了解您为什么要调用 reloadData 而不仅仅是更新屏幕上的单元格。
  • 上面添加的附加说明...单元格的宽度随着用户键入而变化。如果不调用 reloadData,我该怎么做?
  • 我目前的理论是你正在导致整个布局重排,如果你有足够的(数万个)项目,这可能需要很长时间。可能是由于某些布局优化,您说它快速的两种情况(固定尺寸和大尺寸)没有重排整个事情。您是否尝试过将结果集限制为 100 个项目?
  • 另外,您可以尝试分析它吗?你在使用自动布局吗?

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


【解决方案1】:

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

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

这里,indexPath 是对应UICollectionViewCell 对象的NSIndexPath 对象 你想更新的。

【讨论】:

  • 我喜欢使用 insertItemsAtIndexPaths 或 reloadItemsAtIndexPaths 循环遍历数据的想法,这让我有机会继续检查 NSOperation 是否已取消(即用户键入了一个新字母)。到目前为止,我一直无法让它发挥作用。我今晚再试一次...
  • 据我了解,整个布局正在重排,因此您不能只重新加载选定项目。布局实际上必须失效。
  • 考虑到每次击键(包括单元格宽度)都会更改整个数据源(单词列表),我仍然不知道如何避免执行 reloadData。这是我的程序的一般流程:1. textDidChange 取消所有操作,2. 将 NSOperation 添加到队列中(只有 1 个并发),3. 操作调用方法从后台的字母中查找单词(如果取消则中止),4. 更新数据找到单词的源(如果没有取消),5. 在主线程上重新加载数据(如果没有取消)。
  • 我在想也许我可以在第 5 步中执行自己的循环来手动 insertItemsAtIndexPaths,这样我就可以继续检查 isCancelled,但我仍然无法让它工作。想法?
  • 这是大多数情况下的正确答案。在我的具体情况下,没有办法避免 reloadData,所以我只是将 numberOfItemsInSection 限制为一个较小的数字,然后提供一个“加载更多”按钮。
猜你喜欢
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 2018-06-08
  • 1970-01-01
  • 2021-12-13
  • 2018-05-29
相关资源
最近更新 更多