gpt4 book ai didi

ios - 重新加载一批 UICollectionView 或 UITableView 更改的好算法?

转载 作者:可可西里 更新时间:2023-11-01 03:26:44 25 4
gpt4 key购买 nike

设置:我有一个由简单数组数据源支持的 UICollectionViewUITableView。我在 Controller 中保留了该数据源的副本。

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

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

  • 与 UI 当前显示内容同步的上一个数组
  • 添加、删除、移动项目的新数组

为了让 UI 与新数组同步,我需要生成一堆 UI 调用。在 UICollectionView 的情况下,那些是

- (void)insertItemsAtIndexPaths:(NSArray *)indexPaths
- (void)moveItemAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath
- (void)deleteItemsAtIndexPaths:(NSArray *)indexPaths

UITableView 也有一组类似的方法。

我特别不想重新加载整个表,因为这比只处理几个项目的成本更高。

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

最佳答案

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

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

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

因此,如果我们将操作限制为上面列出的操作,则 An Algorithm for Differential File Comparison 中描述的 Hunt-McIlroy 算法,或其之一 descendents , 会找到一组接近最优的变化。

你的问题和经典的diff/patch 的区别在于你有一个二维表,而diff/patch 处理一组一维项目(文本行)。将二维问题转换为一维问题的最佳方法取决于数据表中倾向于进行的更改的特定特征。

例如,如果表是 n 行乘 m 列并且更改倾向于按行分组或行作为一个整体插入或删除,那么您将可能最好将该表视为一个文本文件,然后逐行进行diff。或者,如果更改倾向于按列分组或插入或删除列,您可以逐列执行diff。如果更改包括插入或删除单个单元格(这会导致后续单元格向右或向左移动),您可以将表格视为表格中的每个单元格都在文本文件的单独行上,线性化表格以行优先或列优先的顺序。

但是,在不知道这方面问题的详细信息的情况下,我倾向于避免过早优化。因此,如果 m <n,我倾向于从逐行实现 Hunt-McIlroy 算法开始,如果 n,则逐列实现 <m,然后分析正在使用的应用程序一段时间,然后再决定是使用更复杂的算法版本还是将您的问题映射到 Hunt-McIlroy 解决方案。

可以找到关于各种diff 算法的很好的讨论here on stackoverflow .

关于ios - 重新加载一批 UICollectionView 或 UITableView 更改的好算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14193565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com