Swift / iOS 或其他有效实现的 Android DiffUtil 等价物

Equivalent of Androids DiffUtil for Swift / iOS or other effective implementation

在我的应用程序中,我必须从 Web 服务加载一些数据。然后我必须按模型集合 属性 的模型属性对数据进行排序,然后用新数据更新我的 collectio 视图。

不幸的是,我不知道如何知道哪个单元格移动到了哪个新位置。在 Android 上,我过去使用过 DiffUtil,但我不知道有一个 Swift 等效于在我的集合视图中设置动画变化。

这是我使用的数据模型。对于这个例子,我省略了所有其他字段并使用协议使其更清晰(至少我希望这样更清晰):

protocol Alert {
  var date: Date
  var statusType: StatusType
}

protocol Status {
  var statusType: StatusType
  var level: Level
}

protocol Device {
  var states: [Status] //Contains never more than 1 Status of each StatusType so its basically a set
  var alertsByStatusType: [StatusType: [Alert]]
}

enum StatusType {
  case someStatus, someOtherStatus
}

enum Level {
  case low, medium, high
}

Web 服务 returns 我是一个包含 Status 集合和 Alert 集合的设备。

//Web service model kind of sucks
protocl WebServiceDevice {
  var states: [Status]
  var alerts: [Alert]
}

在设备构造函数中,我进行了一些手动排序和映射以构建 alertsByStatusType 字典。我还按 Status.levelStatus 集合进行排序,因此首先是所有 "high" 级别状态,然后是 "medium" 级别,最后是 "low" 级别状态。

在同一级别内,然后我必须按 Alerts.date 排序,所以当两个 Status 具有相同的 Level 时,较新的 Alert先来。

我知道,我从 Web 服务获得的这个数据模型一开始就很糟糕,我请求一个合适的模型,其中警报在其相应的状态内并且状态被正确排序但是嘿,这就是生活。

现在,当我在 table 视图中显示所有状态时,假设 Statuslevel == low 获取并发出警报,然后级别将更改,并且在从Web 服务和排序所有内容,它将进一步到 Device.states 集合的开头。 我如何知道我必须将单元格从哪个 indexPath 移动到哪个新的 indexPath?

我希望你明白我的意思和问题所在。基本上我必须找出哪个 Status 有不同的 Level 以及它在我的 table 视图的数据源中从哪里移动到哪里,这样我就可以为更改设置动画而不是调用 reload() 在 table 视图上。

我不确定为什么,但我为这个问题选择的正确答案已经消失,所以我想我会自己回答。有人向我指出了一个可以做到这一点的库,在撰写本文时,我发现了更多的库。

它们可能都有起伏,我现在使用的是 Dwifft 库 (https://github.com/jflinter/Dwifft)

其他有趣的 diff 库可以在这里找到:https://awesome-repos.ecp.plus/ios.html 数据结构/算法 部分下

由于 ListDiff 函数,Instagram 的 IGListKit 在处理列表视图(即 UICollectionView)中的数组方面做得非常好。