Je travaille sur une application iPhone régulière qui tire des données d'un serveur (XML, JSON, etc.), et je me demande quel est le meilleur moyen de mettre en œuvre des données de synchronisation. Les critères sont une vitesse (moins d'échange de données de réseau), une robustesse (récupération de données dans le cas de la mise à jour échoue), l'accès et la flexibilité hors ligne (adaptables lorsque la structure de la base de données change légèrement, comme une nouvelle colonne). Je sais que cela varie de l'application à l'application, mais pouvez-vous partager certaines de votre stratégie / expérience? P>
Pour moi, je pense à quelque chose comme ceci: p>
1) Stockez la dernière date modifiée dans iPhone p>
2) Lors du lancement, envoyez un message comme getnewdata.php? lastmodifieddate = ... p>
3) Server traitera et renvoyera uniquement les données modifiées de la dernière fois. P>
4) Ces données sont formatées comme suit: p>
Je ne veux pas faire <+>, <->, <%> ... pour chaque attribut également, car il serait trop compliqué, donc probablement lors de la réception d'un champ <%>, je voudrais juste Supprimez les données avec l'ID spécifié, puis l'ajoutez à nouveau (en supposant que l'ID n'est pas un champ automatiquement incrémenté automatiquement). P>
5) Une fois que tout est téléchargé et mis à jour, je mettrai à jour le dernier champ de date modifié. P>
Le principal problème avec cette stratégie est la suivante: si le réseau diminue lorsque je mette à jour quelque chose => La dernière date modifiée n'est pas encore mise à jour => la prochaine fois que je relais l'application, je devrai parcourir la même chose. . Sans parler des données incohérentes potentielles. Si j'utilise une table temporaire pour la mise à jour et que vous effectuez le tout atomique, cela fonctionnerait, mais encore une fois, si la mise à jour est trop longue (beaucoup de changement de données), l'utilisateur doit attendre longtemps jusqu'à ce que de nouvelles données soient disponibles. Devrais-je utiliser la date de dernière modification pour chacun des données de données et mettre à jour les données progressivement? P> <+> <-> <%>
3 Réponses :
Je commencerais en faisant la mise à jour de la routine atomique, puisque vous en aurez suffisamment sur vos mains, déterminez comment obtenir la communication client-serveur fonctionner correctement. P>
Après cela est un bon moment pour envisager de la modifier d'être incrémental, mais seulement après avoir fait des tests pour déterminer si c'est vraiment nécessaire. Si vous ajustez votre protocole de mise à jour pour être aussi basse que possible possible, vous pouvez découvrir que même une "grosse" mise à jour est suffisamment téléchargée assez rapidement. P>
Une autre façon de regarder c'est de vous demander, à quelle fréquence y a-t-il des problèmes de réseau lorsqu'un utilisateur moyen fait une synchronisation? Vous ne voulez probablement pas accorder des scénarios improbables. P>
Si vous essayez d'optimiser (minimiser) le transfert de données Vous pouvez envisager un format différent de XML, car XML est assez verbeux. Ou au moins, vous voudrez peut-être échanger une lisibilité de XML pour l'espace en rendant chaque nom d'élément et en attribuant le plus petit possible, et élimine toute utilisation de WhitSpace inutile. P>
Votre schéma de base est bon. La chose que vous devez faire est de faire de vos mises à jour idempotent afin de pouvoir redémarrer un transfert partiellement rempli sans risque. C'est une meilleure façon d'aller que d'essayer de mettre en œuvre une sorte de véritable commit atomique (bien que vous puissiez le faire aussi, en utilisant, par exemple, la base de données SQLITE). P>
Dans notre expérience des mises à jour relativement importantes (10s de KB) peut être téléchargée assez rapidement si le serveur est assez rapide. Aucun grand besoin de casser des mises à jour dans de minuscules bits. Mais cela ne fera certainement pas de mal d'essayer de minimiser la quantité de données transférées en gardant des informations plus granulaires sur la "dernière mise à jour". P>
(et vous devez absolument utiliser JSON plutôt que XML comme représentation de données transmise.) p>
Je me demande si vous avez envisagé d'utiliser un cadre de synchronisation pour gérer la synchronisation. Si ces intérêts, vous pouvez consulter le projet Open Source, le service Sync OpenMobster. Vous pouvez faire les opérations de synchronisation suivantes
En plus de cela, toutes les modifications sont automatiquement suivies et synchronisées avec le nuage. Vous pouvez avoir votre application hors ligne lorsque la connexion réseau est en panne. Il suivra toutes les modifications et automatiquement dans l'arrière-plan la synchronisez avec le nuage lorsque la connexion revient. Il fournit également une synchronisation comme iCloud sur plusieurs périphériques p>
également, les modifications du cloud sont synchronisées à l'aide des notifications push, de sorte que les données sont toujours à jour même si elles sont stockées localement. P>
dans votre CAS, P>
Criteria are speed (less network data exchange), robustness (data recovery in case update fails), offline access
Vitesse: Seuls les modifications sont envoyées sur le réseau dans les deux directions p> li>
robustesse: il stocke des données dans un magasin transactionnel comme SQLite et toute mise à jour échouée sont communiquées dans la charge utile SyncML. Seules les opérations réussies sont traitées tandis que les opérations ayant échoué sont réessayées lors de la synchronisation suivante P> LI> ul>
Voici un lien vers le projet Open Source: http://openmobster.googlecode.com a > p> Voici un lien vers l'application iPhone Sync: http: // code.google.com/p/openmobster/wiki/iphonesyncapp p> p>