在我的应用中,我必须从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
字典。我还按Status
对Status.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
在桌子上查看。
答案 0 :(得分:2)
我不确定为什么,但我选择的正确答案的答案已经消失,所以我想我会自己回答。我被指向一个可以做到这一点的图书馆,到写作的时候,我发现了更多的图书馆。
他们可能都有起伏,我现在使用的是Dwifft图书馆(https://github.com/jflinter/Dwifft)
其他有趣的差异库可以在这里找到:数据结构/算法部分下的https://awesome-repos.ecp.plus/ios.html
答案 1 :(得分:0)
Instagram的IGListKit在列表视图(即UICollectionView)中处理数组方面做得非常好,这得益于ListDiff函数。