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.level
对 Status
集合进行排序,因此首先是所有 "high" 级别状态,然后是 "medium" 级别,最后是 "low" 级别状态。
在同一级别内,然后我必须按 Alerts.date
排序,所以当两个 Status
具有相同的 Level
时,较新的 Alert
先来。
我知道,我从 Web 服务获得的这个数据模型一开始就很糟糕,我请求一个合适的模型,其中警报在其相应的状态内并且状态被正确排序但是嘿,这就是生活。
现在,当我在 table 视图中显示所有状态时,假设 Status
和 level == 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)中的数组方面做得非常好。
在我的应用程序中,我必须从 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.level
对 Status
集合进行排序,因此首先是所有 "high" 级别状态,然后是 "medium" 级别,最后是 "low" 级别状态。
在同一级别内,然后我必须按 Alerts.date
排序,所以当两个 Status
具有相同的 Level
时,较新的 Alert
先来。
我知道,我从 Web 服务获得的这个数据模型一开始就很糟糕,我请求一个合适的模型,其中警报在其相应的状态内并且状态被正确排序但是嘿,这就是生活。
现在,当我在 table 视图中显示所有状态时,假设 Status
和 level == 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)中的数组方面做得非常好。