Ho lavorato su un metodo per sincronizzare i dati principali memorizzati in un'applicazione iPhone tra più dispositivi, come un iPad o un Mac. Non ci sono molti (se ve ne sono) framework di sincronizzazione da utilizzare con Core Data su iOS. Tuttavia, ho pensato al seguente concetto:
- Viene apportata una modifica all'archivio dati core locale e la modifica viene salvata. (a) Se il dispositivo è online, tenta di inviare il changeset al server, incluso l'ID del dispositivo che ha inviato il changeset. (b) Se il changeset non raggiunge il server o se il dispositivo non è online, l'app aggiungerà il set di modifiche a una coda da inviare quando sarà online.
- Il server, seduto nel cloud, unisce i set di modifiche specifici che riceve con il suo database principale.
- Dopo che un set di modifiche (o una coda di set di modifiche) viene unito sul server cloud, il server invia tutti questi set di modifiche agli altri dispositivi registrati con il server utilizzando una sorta di sistema di polling. (Ho pensato di utilizzare i servizi Push di Apple, ma a quanto pare secondo i commenti questo non è un sistema funzionante.)
C'è qualcosa di speciale a cui devo pensare? Ho esaminato i framework REST come ObjectiveResource , Core Resource e RestfulCoreData . Ovviamente, stanno tutti lavorando con Ruby on Rails, a cui non sono legato, ma è un punto di partenza. I requisiti principali che ho per la mia soluzione sono:
- Eventuali modifiche devono essere inviate in background senza mettere in pausa il thread principale.
- Dovrebbe utilizzare la minore larghezza di banda possibile.
Ho pensato a una serie di sfide:
- Assicurarsi che gli ID oggetto per i diversi archivi di dati su dispositivi diversi siano collegati sul server. Vale a dire, avrò una tabella di ID oggetto e ID dispositivo, che sono collegati tramite un riferimento all'oggetto archiviato nel database. Avrò un record (DatabaseId [unico per questa tabella], ObjectId [unico per l'elemento nell'intero database], Datafield1, Datafield2), il campo ObjectId farà riferimento a un'altra tabella, AllObjects: (ObjectId, DeviceId, DeviceObjectId). Quindi, quando il dispositivo esegue il push up di un set di modifiche, passerà lungo l'ID del dispositivo e l'oggettoId dall'oggetto dati principale nell'archivio dati locale. Quindi il mio server cloud verificherà con objectId e ID dispositivo nella tabella AllObjects e troverà il record da modificare nella tabella iniziale.
- Tutti i cambiamenti devono essere marcati con il timestamp, in modo che possano essere uniti.
- Il dispositivo dovrà eseguire il polling del server, senza consumare troppa batteria.
- I dispositivi locali dovranno inoltre aggiornare tutto ciò che è in memoria se / quando le modifiche vengono ricevute dal server.
C'è qualcos'altro che mi manca qui? Quali tipi di framework dovrei guardare per renderlo possibile?