等效的Androids DiffUtil for Swift / iOS或其他有效的实现

时间:2017-05-22 19:31:36

标签: ios swift tableview diff

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

不幸的是,我不知道我怎么知道哪个单元移动到哪个新位置。在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服务返回一个设备,其中包含Status和Alert集合的集合。

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

在设备构造函数中,我做了一些手动排序和映射来构建alertsByStatusType字典。我还按StatusStatus.level集合进行排序,以便首先,所有“高”级别状态,然后是“中”级别,最后是“低”级别状态。

在同一级别内,我必须按Alerts.date排序,以便当两个Status具有相同的Level时,具有更新Alert的那个首先出现Status

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

现在,当我在tableview中显示所有状态时,假设level == low Device.states获取并发出警报,那么级别将会更改,并且在从Web服务更新我的数据并对所有内容进行排序后,它将在Status集合中进一步开始。 如何知道我必须将哪个indexPath移动到哪个新的indexPath?

我希望你明白我的意思和问题所在。基本上我必须找出哪个Level具有不同的reload()以及它在我的表格视图的数据源中移动的位置,以便我可以为更改设置动画,而只需调用_)$*%RDELETE FROM Character WHERE sid >=1在桌子上查看。

2 个答案:

答案 0 :(得分:2)

我不确定为什么,但我选择的正确答案的答案已经消失,所以我想我会自己回答。我被指向一个可以做到这一点的图书馆,到写作的时候,我发现了更多的图书馆。

他们可能都有起伏,我现在使用的是Dwifft图书馆(https://github.com/jflinter/Dwifft

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

答案 1 :(得分:0)

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