Je travaille sur une méthode pour synchroniser les données de base stockées dans une application iPhone entre plusieurs appareils, comme un iPad ou un Mac. Il n'y a pas beaucoup (voire pas du tout) de cadres de synchronisation à utiliser avec Core Data sur iOS. Cependant, j'ai pensé au concept suivant:
- Une modification est apportée au magasin de données de base local et la modification est enregistrée. (a) Si le périphérique est en ligne, il essaie d'envoyer l'ensemble de modifications au serveur, y compris l'ID de périphérique de l'appareil qui a envoyé l'ensemble de modifications. (b) Si l'ensemble de modifications n'atteint pas le serveur, ou si l'appareil n'est pas en ligne, l'application ajoutera l'ensemble de modifications à une file d'attente à envoyer lorsqu'il sera en ligne.
- Le serveur, assis dans le cloud, fusionne les ensembles de modifications spécifiques qu'il reçoit avec sa base de données master.
- Après la fusion d'un jeu de modifications (ou d'une file d'attente de jeux de modifications) sur le serveur cloud, le serveur envoie tous ces jeux de modifications aux autres appareils enregistrés auprès du serveur à l'aide d'une sorte de système d'interrogation. (J'ai pensé à utiliser les services Push d'Apple, mais apparemment, selon les commentaires, ce n'est pas un système viable.)
Y a-t-il quelque chose d'extraordinaire auquel je dois penser? J'ai examiné les cadres REST tels que ObjectiveResource , Core Resource et RestfulCoreData . Bien sûr, tout cela fonctionne avec Ruby on Rails, auquel je ne suis pas lié, mais c'est un point de départ. Les principales exigences que j'ai pour ma solution sont:
- Toute modification doit être envoyée en arrière-plan sans interrompre le thread principal.
- Il doit utiliser le moins de bande passante possible.
J'ai réfléchi à un certain nombre de défis:
- Assurez-vous que les ID d'objet des différents magasins de données sur différents appareils sont connectés sur le serveur. C'est-à-dire que j'aurai une table d'ID d'objet et d'ID de périphérique, qui sont liés via une référence à l'objet stocké dans la base de données. J'aurai un enregistrement (DatabaseId [unique à cette table], ObjectId [unique à l'élément dans la base de données entière], Datafield1, Datafield2), le champ ObjectId référencera une autre table, AllObjects: (ObjectId, DeviceId, DeviceObjectId). Ensuite, lorsque le périphérique envoie un ensemble de modifications, il transmet l'ID de périphérique et le objectId de l'objet de données principal dans le magasin de données local. Ensuite, mon serveur cloud vérifiera par rapport à l'ID d'objet et à l'ID de périphérique dans la table AllObjects, et trouvera l'enregistrement à modifier dans la table initiale.
- Toutes les modifications doivent être horodatées afin de pouvoir être fusionnées.
- L'appareil devra interroger le serveur, sans utiliser trop de batterie.
- Les appareils locaux devront également mettre à jour tout ce qui est en mémoire si / quand des modifications sont reçues du serveur.
Y a-t-il autre chose qui me manque ici? Quels types de cadres dois-je envisager pour rendre cela possible?