插入或删除许多项时,UICollectionView非常慢

时间:2015-03-23 17:19:54

标签: ios objective-c uicollectionview

我正在尝试从集合视图中插入和删除大量项目(例如,20,000),并且操作需要很长时间。

我创建的测试夹具由以下部分组成:

  • UICollectionView除了数据源之外没有任何配置。
  • 默认UICollectionViewFlowLayout
  • 根据BOOL变量返回10K或30K项目的数据源。
  • 按钮切换该变量。设置为YES时,数据源(仅更改numberOfItemsInSection:)和insertItemsAtIndexPaths:的20K项目将被添加到数据源中。设置为NO时,将使用20K项目调用deleteItemsAtIndexPaths:
  • 除了将默认UICollectionViewCell出列并将其返回之外,数据源中的单元格配置不执行任何操作。

在模拟器上运行它,它应该比任何设备更快,产生以下时间:

  • 插入20K物品:220ms。
  • 删除相同的20K项目:1100ms。

这无论如何都非常慢,尤其是在主线程上执行时。

这是仪器的截图,显示了UICollectionView内部实现中的热点(具体来说,_computeItemUpdates):

Instruments

我注意到使用reloadData代替插入或更新项目的速度更快(~20ms),可能是因为没有触发动画,所以不需要计算每个项目和部分的位置用于动画目的。

任何有关如何克服这一点的想法都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

展开_computeItemUpdates。如果它的任何呼叫都是你的,那么你可以。

例如,如果您使用自定义布局,您可以要求它在后台线程上计算新位置,然后在该操作完成时调用插入/删除。

你也可以很聪明,只能为当前可见的范围调用插入/删除,然后在重新排列动画结束后你可以reloadData,它不应该与用户的观点有太大的不同