重新加载一批UICollectionView或UITableView的好算法有什么变化吗?

Jaa*_*nus 7 uitableview ios uicollectionview

设置:我有一个UICollectionViewUITableView那个由简单的数组数据源支持.我在控制器中保留了该数据源的副本.

现在,我从系统收到一条通知,告知有新数据可用.我得到一个新的数组,其中可能已添加,删除和更改位置的项目.

所以现在我有两个数据对象:

  • 以前的数组与UI当前显示的数据同步
  • 已添加,删除,移动项目的新数组

为了使UI与新数组同步,我需要生成一堆UI调用.如果是UICollectionView,那些是

- (void)insertItemsAtIndexPaths:(NSArray *)indexPaths
- (void)moveItemAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath
- (void)deleteItemsAtIndexPaths:(NSArray *)indexPaths
Run Code Online (Sandbox Code Playgroud)

还有一套类似的方法UITableView.

我特别不想重新加载整个表,因为这比仅使用几个项目更昂贵.

因此,问题是:给定前一个和新的数据源数组,如何生成正确的UI调用集,以及何时"换出"旧的数据源为新的?

Sim*_*mon 8

我认为这在很大程度上等同于diff/patch问题,其目的是找到一个文本文件与另一个文本文件之间的最小数量的更改,然后应用这些更改.在这种情况下,实现定义了操作:

  • 添加或插入
  • 删除
  • 更改

......但不.省略移动的原因对我来说并不是很明显,但我强烈怀疑包括移动在内需要非常昂贵的计算以找到最佳移动.

因此,如果我们将操作限制为上面列出的那些操作,那么在"差异文件比较算法 "或其后代之一中描述的Hunt-McIlroy算法将找到接近最佳的更改集.

您的问题与经典差异/补丁之间的区别在于您有一个二维表,而差异/补丁处理一维项目(文本行).将二维问题转换为一维问题的最佳方法取决于数据表中倾向于进行的更改的特定特征.

例如,如果表是n行× m列,并且更改往往按行分组或行作为整体插入或删除,那么您可能最好将该表视为文本文件并执行差异逐行.或者,如果更改倾向于按列分组或插入或删除列,则可以逐列进行diff.如果更改包括插入或删除单个单元格(导致后续单元格因此向右或向左移动),则可以将表格视为表格中的每个单元格位于文本文件的单独行上,从而使表格线性化以行优先或列优先顺序排列.

然而,在不知道这方面问题的细节的情况下,我的倾向是避免过早优化.因此,如果m < n,我倾向于逐行实现Hunt-McIlroy算法,如果n < m则逐列实现Hun-McIlroy算法,然后在决定使用之前对应用程序进行一段时间的分析.更复杂的算法版本或您的问题与Hunt-McIlroy解决方案的替代映射是有必要的.

有关各种diff算法的详细讨论可以在stackoverflow上找到.