安装程序:我有一个由简单数组数据源支持的UICollectionView或UITableView.我在控制器中保留了该数据源的副本.
现在,我从系统收到一条通知,告知有新数据可用.我得到一个新的数组,其中可能已添加,删除和更改位置的项目.
所以现在我有两个数据对象:
>以前的数组与UI当前显示的内容同步
>新数组,其中添加,删除,移动项目
为了使UI与新数组同步,我需要生成一堆UI调用.在UICollectionView的情况下,那些是
- (void)insertItemsAtIndexPaths:(NSArray *)indexPaths - (void)moveItemAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath - (void)deleteItemsAtIndexPaths:(NSArray *)indexPaths
UITableView有一组类似的方法.
我特别不想重新加载整个表,因为这比仅使用几个项目更昂贵.
解决方法
我认为这在很大程度上等同于diff / patch问题,其目的是找到一个文本文件与另一个文本文件之间的最小数量的更改,然后应用这些更改.在这种情况下,实现定义了操作:
……但不动.省略移动的原因对我来说并不是很明显,但我强烈怀疑包括移动在内需要非常昂贵的计算以找到最佳移动.
因此,如果我们将操作限制为上面列出的那些操作,An Algorithm for Differential File Comparison或其中一个descendents中描述的Hunt-McIlroy算法将找到接近最佳的更改集.
您的问题与经典差异/补丁之间的区别在于您有一个二维表,而差异/补丁处理一维项目(文本行).将二维问题转换为一维问题的最佳方法取决于数据表中倾向于进行的更改的特定特征.
例如,如果表是n行×m列,并且更改往往按行分组或行作为整体插入或删除,那么您可能最好将该表视为文本文件并执行差异逐行.或者,如果更改倾向于按列分组或插入或删除列,则可以逐列进行diff.如果更改包括插入或删除单个单元格(导致后续单元格因此向右或向左移动),则可以将表格视为表格中的每个单元格位于文本文件的单独行上,从而使表格线性化以行优先或列优先顺序排列.
然而,在不知道问题的细节的情况下,我倾向于避免过早优化.因此,如果m