Dans mon application, je dois charger des données à partir d'un service Web. Ensuite, je dois trier les données par les propriétés des modèles d'une propriété de collection du modèle, puis mettre à jour ma vue collectio avec les nouvelles données.Equivalent de Androids DiffUtil pour Swift/iOS ou autre implémentation efficace
Malheureusement je n'ai aucune idée de comment je peux savoir quelle cellule a bougé à quelle nouvelle position. Sur Android, j'ai utilisé DiffUtil par le passé mais je ne connais pas d'équivalent Swift pour animer les changements dans ma vue de collection.
Voici le modèle de données que j'utilise. Pour le cet exemple, je laisse de côté tous les autres domaines et utiliser des protocoles pour le rendre plus clair (au moins j'espère que cela le rend plus clair):
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
}
Le service web me retourne un dispositif qui contient une collection de statut et une collection d'Alert.
//Web service model kind of sucks
protocl WebServiceDevice {
var states: [Status]
var alerts: [Alert]
}
Dans le constructeur de l'appareil, je fais du tri manuel et la cartographie pour construire le dictionnaire alertsByStatusType
. Je trier également la collection Status
par le Status.level
de sorte que d'abord, tous les états de niveau "haut" viennent, puis le niveau "moyen" et enfin les états de niveau "bas".
A l'intérieur du même niveau, je dois ensuite trier par le Alerts.date
donc quand deux Status
ont le même Level
, celui avec la Alert
plus récente vient en premier. Je sais, ce modèle de données que je reçois du service web est terrible pour commencer et j'ai demandé un bon modèle où les alertes sont dans leurs états correspondants et les états sont correctement triés mais bon, c'est la vie. Maintenant, quand j'affiche tous les états dans une vue de table, disons Status
avec level == low
obtient et alerte, puis le niveau changera et après la mise à jour de mes données du service Web et le tri de tout, il sera plus loin dans le début la collection Device.states
. Comment puis-je savoir à partir de quel indexPath je dois déplacer la cellule vers quel nouveau indexPath?
J'espère que vous comprenez ce que je veux dire et quel est le problème. Fondamentalement, je dois savoir quel Status
a un différent Level
et d'où à où il a déplacé dans la source de données de ma vue de table afin que je puisse animer les changements à la place il suffit d'appeler reload()
sur la vue de la table.