我正在尝试从集合视图中插入和删除大量项目(例如,20,000),并且操作需要很长时间。
我创建的测试夹具由以下部分组成:
UICollectionView
除了数据源之外没有任何配置。UICollectionViewFlowLayout
。BOOL
变量返回10K或30K项目的数据源。YES
时,数据源(仅更改numberOfItemsInSection:
)和insertItemsAtIndexPaths:
的20K项目将被添加到数据源中。设置为NO
时,将使用20K项目调用deleteItemsAtIndexPaths:
。UICollectionViewCell
出列并将其返回之外,数据源中的单元格配置不执行任何操作。在模拟器上运行它,它应该比任何设备更快,产生以下时间:
这无论如何都非常慢,尤其是在主线程上执行时。
这是仪器的截图,显示了UICollectionView内部实现中的热点(具体来说,_computeItemUpdates
):
我注意到使用reloadData
代替插入或更新项目的速度更快(~20ms),可能是因为没有触发动画,所以不需要计算每个项目和部分的位置用于动画目的。
任何有关如何克服这一点的想法都将受到赞赏。
答案 0 :(得分:0)
展开_computeItemUpdates
。如果它的任何呼叫都是你的,那么你可以。
例如,如果您使用自定义布局,您可以要求它在后台线程上计算新位置,然后在该操作完成时调用插入/删除。
你也可以很聪明,只能为当前可见的范围调用插入/删除,然后在重新排列动画结束后你可以reloadData
,它不应该与用户的观点有太大的不同