2009-08-18 5 views
4

Je suis en train de construire mon modèle Core Data, que je voudrais synchroniser entre les versions Mac et iPhone de mon application.Synchronisation du modèle de données de base entre Mac et iPhone

Je vais utiliser Bonjour pour la découverte de périphériques, etc. mais j'ai une question concernant la partie de synchronisation des données du problème. Jusqu'ici j'ai ajouté un UID et un horodatage de modification à chaque objet qui sera impliqué dans la synchronisation, donc je devrais être capable de faire correspondre les objets et de détecter ceux qui ont changé.

Existe-t-il de bons liens, des ressources sur l'écriture de code de synchronisation pour ce type de situation, c'est-à-dire la synchronisation des enregistrements entre deux instances d'un modèle? Synchronisation est un problème avec un certain nombre de cas de bord qui ont été résolus à plusieurs reprises par des personnes dans le passé, donc je m'attendais à trouver des informations sur le sujet, mais tout ce que je peux trouver sont des liens vers SyncServices d'Apple. n'existe pas sur iPhone) et de la technologie MS sync. Je cherche vraiment la théorie générale pour que je puisse l'implémenter moi-même, pas nécessairement une solution prête à l'emploi.

Répondre

8

La spécification SyncML peut être utile, mais elle est assez difficile à lire et, évidemment, biaisée vers SyncML.

J'ai dû mettre en œuvre pour cette Task Coach, alors voici quelques idées:

Un drapeau de modification est suffisant, un horodatage ne fournit pas vraiment beaucoup plus d'informations. En règle générale, mes objets sont dans un de ces états:

  • Aucun
  • Nouveau
  • Deleted
  • Modified

Les transitions suivantes se produisent lorsque l'objet est modifié:

  • Aucun -> Modifié
  • Nouveau -> Nouveau
  • supprimé -> (ne devrait pas arriver)
  • Modifié -> Modifié

et les suivantes quand il est supprimé:

  • Aucun -> supprimé
  • Nouveau -> Effacement réel (il peut être retiré du stockage)
  • Supprimé -> (ne devrait pas se produire)
  • Modifié -> Supprimé

Lors de la synchronisation, l'appareil envoie d'abord au poste de travail tous les objets dont l'état est différent de Aucun. Le bureau demande à l'utilisateur de résoudre les conflits si l'un de ceux-ci a un statut! = None de son côté. Dans tous les cas, l'objet entre dans l'état Aucun sur le périphérique ou est supprimé du stockage si son état a été supprimé.

Ensuite, le bureau envoie ses propres modifications à l'appareil. Il n'y a pas de conflit possible puisque tous les objets sont dans l'état Aucun sur le périphérique. Les objets sur le bureau passent à l'état Aucun ou sont également supprimés du stockage, et la synchronisation est terminée.

Il existe deux types de conflits possibles, en fonction des états périphérique/de bureau:

  • modifié/supprimé. Si l'utilisateur choisit de faire confiance à l'appareil, l'objet de bureau est remplacé par celui de l'appareil; Sinon, le bureau ne fait rien et conserve l'état supprimé, de sorte que l'objet sera retiré de l'appareil dans la phase 2.
  • supprimé/Si l'appareil gagne, l'objet est réellement supprimé du bureau. Sinon, l'objet passe à l'état Nouveau sur le bureau afin qu'il soit restauré sur l'appareil en phase 2.
  • supprimé/supprimé: Duh. Retirez-le du stockage. Modifié/modifié: L'utilisateur décide quelles valeurs conserver, peut-être sur une base champ par champ. L'état reste sur Modifié sur le poste de travail afin que ces choix soient renvoyés au périphérique en phase 2.

Certains conflits peuvent être évités si l'état Modifié est conservé pour chaque champ, par exemple un objet avec un objet modifié sur l'appareil et un résumé modifié sur le bureau ne déclencheront pas de conflit. Vous pouvez jeter un oeil au code de Task Coach pour un exemple (référentiel SVN sur SourceForge, il a à la fois l'application de bureau en Python et l'application iPhone). En fait, dans ce cas, j'ai décidé d'utiliser une approche plus simple; Je ne garde pas trace de l'état sur le bureau. Après la phase 1 (périphérique à bureau), je viens de faire un remplacement complet des objets sur l'appareil avec ceux sur le bureau. Ainsi, il n'y a pas de conflit (l'appareil gagne toujours).

Évidemment, cela fonctionne seulement entre deux dispositifs fixes; Si vous voulez synchroniser avec plusieurs téléphones/applications de bureau, vous devez attribuer un identifiant unique à chacun et garder différents états pour différents appareils/applications. Cela peut commencer à devenir poilu.

HTH

+0

L'horodatage aide à distinguer les modifications simultanées sur deux périphériques. Si vous utilisez simplement un indicateur booléen 'modified', il est difficile de savoir quelles sont les données les plus récentes. – AlBlue

+0

Merci fraca7, c'était juste le genre de chose que je suis après. Je vais aussi regarder dans les docs SyncML pour voir s'ils vont dans ce genre de détail. D'autres suggestions quelqu'un? –

+0

AlBlue: c'est si vous voulez une sorte de résolution automatique des conflits, mais je préfère demander à l'utilisateur. Si les deux enregistrements ont été modifiés, il devrait être celui qui décide. – fraca7

2

Marcus Zarra a créé un cadre appelé ZSync pour simplifier la synchronisation des applications iPhone/iPad à leurs homologues Mac. Jetez un coup d'oeil, cela peut aider à résoudre le problème.

+0

Merci John, j'ai suivi ZSync pendant un moment, j'attends juste de voir comment ça se passe dans une application du monde réel en premier. Cela ressemble à un bon projet et pourrait très bien répondre à mes besoins. –

+0

Assurez-vous que MoneyWell pour iPhone utilise ZSync maintenant (http://nothirst.com/moneywell/iphone/) – petert

Questions connexes