2017-05-22 3 views
0

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.

Répondre

1

Je ne sais pas pourquoi, mais la réponse que j'ai choisie pour cette question a disparu, alors j'ai pensé que j'y répondrais moi-même. On m'a montré une bibliothèque qui peut faire exactement cela et au moment de l'écriture, j'ai trouvé plus de bibliothèques.

Ils ont probablement tous ont des hauts et des bas et celui que j'utilise est maintenant la bibliothèque Dwifft (https://github.com/jflinter/Dwifft)

Autres bibliothèques intéressantes diff peuvent être trouvés ici: https://awesome-repos.ecp.plus/ios.html sous les Structures de données/algorithmes section