现在,我从系统收到一条通知,告知有新数据可用.我得到一个新的数组,其中可能已添加,删除和更改位置的项目.
所以现在我有两个数据对象:
>以前的数组与UI当前显示的内容同步
>新数组,其中添加,删除,移动项目
为了使UI与新数组同步,我需要生成一堆UI调用.在UICollectionView的情况下,那些是
- (void)insertItemsAtIndexPaths:(NSArray *)indexPaths - (void)moveItemAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath - (void)deleteItemsAtIndexPaths:(NSArray *)indexPaths
UITableView有一组类似的方法.
我特别不想重新加载整个表,因为这比仅使用几个项目更昂贵.
因此,问题是:给定前一个和新的数据源数组,如何生成正确的UI调用集,以及何时“换出”旧的数据源用于新的?
解决方法
>添加或插入
>删除
>改变
……但不动.省略移动的原因对我来说并不是很明显,但我强烈怀疑包括移动在内需要非常昂贵的计算以找到最佳移动.
因此,如果我们将操作限制为上面列出的那些操作,An Algorithm for Differential File Comparison或其中一个descendents中描述的Hunt-McIlroy算法将找到接近最佳的更改集.
您的问题与经典差异/补丁之间的区别在于您有一个二维表,而差异/补丁处理一维项目(文本行).将二维问题转换为一维问题的最佳方法取决于数据表中倾向于进行的更改的特定特征.
例如,如果表是n行×m列,并且更改往往按行分组或行作为整体插入或删除,那么您可能最好将该表视为文本文件并执行差异逐行.或者,如果更改倾向于按列分组或插入或删除列,则可以逐列进行diff.如果更改包括插入或删除单个单元格(导致后续单元格因此向右或向左移动),则可以将表格视为表格中的每个单元格位于文本文件的单独行上,从而使表格线性化以行优先或列优先顺序排列.
然而,在不知道问题的细节的情况下,我倾向于避免过早优化.因此,如果m
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。