UITableView删除、插入&;在批更新中移动订单

UITableView删除、插入&;在批更新中移动订单,uitableview,Uitableview,UITableView在beginUpdates和endUpdates调用之间进行的更新是批处理在一起的,所有调用都是同时执行的。特定于执行插入和删除操作的顺序: 动画块中的删除和重新加载操作指定应删除或重新加载原始表中的哪些行和节;插入指定应将哪些行和节添加到结果表中。用于标识节和行的索引路径遵循此模型。另一方面,在可变数组中插入或删除项可能会影响用于连续插入或删除操作的数组索引;例如,如果在某个索引处插入项,则数组中所有后续项的索引都会递增 还值得注意的是: 可以嵌套对BeginUpdate

UITableView
beginUpdates
endUpdates
调用之间进行的更新是批处理在一起的,所有调用都是同时执行的。特定于执行
插入
删除
操作的顺序:

动画块中的删除和重新加载操作指定应删除或重新加载原始表中的哪些行和节;插入指定应将哪些行和节添加到结果表中。用于标识节和行的索引路径遵循此模型。另一方面,在可变数组中插入或删除项可能会影响用于连续插入或删除操作的数组索引;例如,如果在某个索引处插入项,则数组中所有后续项的索引都会递增

还值得注意的是:

可以嵌套对BeginUpdate和EndUpdate的调用;所有索引都被视为只有外部更新块

[我的重点]

因此:将删除视为在第一次过程中发生,然后使用删除后产生的新索引路径在此之后发生的任何插入


那很有用但是,我没有找到任何关于行(和节)移动发生在何处、应该使用哪个索引以及这是否会影响其他步骤的文档。有人知道吗?

移动表行时,指定两个索引:

  • indepath
    原始表中从何处获取此行
  • newIndexPath
    在将显示此行的结果表中

    func moveRow(在indexPath:indexPath处,到newIndexPath:indexPath)

单个批处理中可能存在冲突操作,导致应用程序崩溃:

  • 尝试移动您同时删除的行
  • 尝试将同一行移动到多个目标
  • 正在尝试将多行移动到同一目标
  • 尝试将行移动到插入新行的同一目标
无法移动要插入的行,因为它不在原始表中


默认情况下,移动的行不会从数据源重新加载。

我尝试用批删除和插入替换tableView.move,因为我知道删除和插入的顺序。但如果运气不好,这一举动似乎有些不同。这使我在使用FetchedResultsController的批更新时犹豫不决,因为我不知道如何处理
NSFetchedResultsChangeType.move
。你有什么进展吗?没有进一步的信息,抱歉-你可能可以测试一下。嗨,Paiv,谢谢你的回答!大约两年前我问过这个问题,现在我无法证实你的答案…我注意到有一个公开的悬赏,是其他人添加的–如果我没有将您的解决方案标记为正确,您是否能够收集此悬赏,前提是他们将其授予您?澄清一下–我想您是说,就索引路径而言,我们可以将移动视为删除和插入的组合?移动操作的“删除”部分与其他删除一起发生(并使用初始索引)。移动操作的插入部分与其他插入一起发生(并使用删除后索引)?这似乎留下了一个剩余的问题,即插入如何排序(以及移动的插入部分)。那么,如果在同一索引中插入(或移动到)多行,会发生什么情况?您提到在移动的情况下,这会导致崩溃。那么,如何在表的开头插入两行呢?在批处理中,您看不到中间步骤,也不使用中间索引进行操作。例如,如果您想在顶部顺序插入两行,您可以使用相同的索引:insert(在0处),insert(在0处)。但在批处理中,您使用最终状态索引进行操作,并以任意顺序声明将并行发生的操作:insert(在0处)、insert(在1处)。您的困惑可能来自您尝试对批处理中发生的操作进行排序。相反,把它们看作是平行发生的。您的工作是声明最终状态,框架负责正确实现并行操作。批处理中的另一个操作是实现细节,不应影响应用程序。