invalidateLayout和reloadData之间的区别

问题描述

我想知道invalidateLayout()reloadData()之间有什么区别 我已经阅读了文档herehere,但还有以下问题:

  1. 我将数据作为数组,这样cellForItemAt indexPath可以直接用dataArray[indexPath.item]引用该数组,并且数组中的每个数据对象都可以填充该单元格。 reloadData()将确保对dataArray进行更改时,这会反映在collectionView中。经过一些小的测试,看来invalidateLayout()也将观察到这一变化。这是真的吗?
  2. 这两个函数在调整单元格大小方面似乎都具有相同的效果,这总是真的吗?
  3. 调用invalidateLayout()时,是否也像cellForItemAt indexPath一样为每个单元格调用reloadData()
  4. 如果上述所有内容都是正确的,那么您甚至还需要使用reloadData(),因为苹果公司表示要谨慎使用它?

从根本上对这两个功能间的区别的任何其他评论都会有所帮助(何时使用每个功能,等等)

解决方法

经过进一步测试...

  1. cellForItemAt indexPath仅针对不在屏幕上但由于invalidateLayout()而现在在屏幕上的单元格被调用。
  2. 这似乎是真的
  3. 请参阅问题1的答案。如果您移动了单元格并且每个单元格中的数据与数据源的顺序不同,则可能会导致问题。
  4. 我现在少用reloadData()

通常,reloadData()也会调用invalidateLayout()(或至少具有类似效果),并且会为每个单元格触发cellForItemAt indexPath。但是,invalidateLayout()仅在单元格现在位于屏幕范围内并且由于布局更改而需要重新加载时才会调用cellForItemAt indexdPath