Construire un tracker d'habitudes en SwiftUI : les parties difficiles
Pas la vue liste. Les calculs de dates, les écritures depuis le widget, et la migration qui a tourné sur 40 000 lignes.
Les captures d’écran de cette app montrent une liste avec des cases à cocher, et une liste avec des cases à cocher, c’est un week-end. C’est ce que je pensais aussi. Les parties difficiles se sont révélées être partout sauf dans la couche de vue, et la plupart sont du genre qu’on ne découvre qu’après que de vraies personnes ont utilisé l’app dans des fuseaux horaires où vous ne vivez pas.
Trois d’entre elles ont coûté des semaines plutôt que des jours. Les calculs de dates, parce qu’« aujourd’hui » n’est plus un concept fixe dès que vous avez des utilisateurs qui franchissent minuit en avion, voyagent entre fuseaux, et attendent qu’une habitude consignée à 01:00 compte pour la veille s’ils le disent. Les écritures depuis le widget, parce qu’un widget interactif tourne dans un autre processus avec une autre vue en bac à sable de votre stockage, et faire apparaître une coche du widget dans l’app sans lancement n’est pas la ligne unique que le code d’exemple laisse croire. Et une migration de schéma sur un stockage de 40 000 entrées, qui va très bien sur mon téléphone et prend onze secondes sur un appareil de quatre ans.
Cet article est le compte rendu technique de ces trois-là, plus les plus petites : le calcul de série qui reste juste quand on rattrape des jours, les observateurs HealthKit qui se déclenchent plus souvent qu’on ne le voudrait, et l’écran de statistiques qui a dû cesser de tout recalculer à chaque apparition.
Le code est inclus là où il est assez court pour être utile.
Plan
Statut : plan. L’introduction ci-dessus est de la copie finie. Tout ce qui suit est le plan des sections de la version complète, visant environ 2 200 mots.
- Ce qui était vraiment facile. La liste, les thèmes et les réglages, en un paragraphe.
- Les calculs de dates. Fuseaux, frontières de journée, début de journée personnalisé, et le test de l’avion.
- Les écritures depuis le widget. Groupes d’apps, le stockage que voit le widget, et recharger la bonne timeline.
- La migration de 40 000 lignes. Ce qu’elle a coûté sur du vieux matériel, et la version par étapes qui est sortie.
- Les séries avec rattrapage. Recalcul, mise en cache, et la règle d’invalidation.
- Les observateurs HealthKit. Se déclencher trop souvent, et amortir sans perdre de mises à jour.
- L’écran de statistiques. Précalculer, et où étaient les images perdues.
- Ce que je ferais autrement. Deux décisions d’architecture, évaluées honnêtement.