2010-06-06 11 views
7

Sto lavorando a un'app per iPhone che estrae dati da un server (XML, JSON, ecc.) E mi chiedo quale sia il modo migliore per implementare i dati di sincronizzazione . I criteri sono la velocità (meno scambio di dati di rete), la robustezza (recupero dei dati in caso di aggiornamento fallito), l'accesso offline e la flessibilità (adattabile quando la struttura del database cambia leggermente, come una nuova colonna). So che varia da app a app, ma voi ragazzi potete condividere parte della vostra strategia/esperienza?La migliore strategia per la sincronizzazione dei dati nell'app per iPhone

Per quanto mi riguarda, sto pensando a qualcosa di simile:

1) Conservare Ultima modifica data data iPhone

2) Al momento del lancio, inviare un messaggio come getNewData.php LastModifiedDate = ...?

3) Il server elaborerà e restituirà solo i dati modificati dall'ultima volta.

4) Questi dati vengono formattati come così:

<+><data id="..."></data></+> // add this to SQLite/CoreData

<-><data id="..."></data></-> // remove this

<%><data id="..."><attribute>newValue</attribute></data></%> // new modified value

Non voglio fare < +>, < ->, <%> ... anche per ogni attributo, perché sarebbe troppo complicato, quindi probabilmente quando si riceve un campo <%, vorrei semplicemente rimuovere i dati con l'id specificato e quindi aggiungerlo di nuovo (supponendo che l'ID qui non sia un campo auto-incrementato automaticamente).

5) Una volta scaricato e aggiornato tutto, aggiornerò il campo Data ultima modifica.

Il problema principale di questa strategia è: Se la rete si arresta quando sto aggiornando qualcosa => la data dell'ultima modifica non è ancora stata aggiornata => la prossima volta rilancio l'app, dovrò passare attraverso la stessa cosa ancora. Per non parlare di potenziali dati incoerenti. Se io uso una tabella temporanea per l'aggiornamento e rendere l'intera cosa atomica, funzionerebbe, ma poi di nuovo, se l'aggiornamento è troppo lungo (molti dati cambiano), l'utente deve attendere molto tempo prima che i nuovi dati siano disponibili. Devo utilizzare Data ultima modifica per ciascun campo dati e aggiornare i dati gradualmente?

risposta

2

Vorrei iniziare rendendo la routine di aggiornamento atomica, dal momento che avrete abbastanza mani per capire come far funzionare correttamente la comunicazione client-server.

Dopo questo è un buon momento per prendere in considerazione la modifica di esso in modo incrementale, ma solo dopo aver effettuato alcuni test per capire se è davvero necessario. Se stai ottimizzando il tuo protocollo di aggiornamento con la larghezza di banda più bassa possibile, potresti scoprire che anche un aggiornamento "grande" viene scaricato abbastanza velocemente.

Un altro modo di guardarlo è chiedersi: quante volte ci saranno problemi di rete quando un utente medio sta eseguendo una sincronizzazione? Probabilmente non vuoi sintonizzarti su scenari improbabili.

Se si sta tentando di ottimizzare (ridurre a icona) il trasferimento dei dati, si consiglia di prendere in considerazione un formato diverso da XML, poiché XML è abbastanza dettagliato. O almeno potresti voler scambiare la leggibilità XML per lo spazio rendendo ogni nome e attributo di ogni elemento il più piccolo possibile ed eliminare tutti gli spazi bianchi non necessari.

0

Il tuo schema di base è buono.La cosa che devi fare è in qualche modo rendere i tuoi aggiornamenti idempotenti in modo da poter riavviare un trasferimento parzialmente completato senza rischi. Questo è un modo migliore per andare piuttosto che provare a implementare una sorta di vero e proprio commit atomico (sebbene si possa fare anche questo, usando, ad esempio, il database SQLite).

In base alla nostra esperienza, è possibile scaricare abbastanza rapidamente gli aggiornamenti (10s di KB), se il server è abbastanza veloce. Non c'è bisogno di rompere gli aggiornamenti in piccoli pezzi. Ma certamente non farà male cercare di minimizzare la quantità di dati trasferiti mantenendo informazioni più granulari su "ultimo aggiornamento".

(E sicuramente si dovrebbe usare JSON invece di XML come rappresentazione dei dati trasmessi.)

0

chiedo se avete pensato di utilizzare un quadro di sincronizzazione per gestire la sincronizzazione. Se ti interessa puoi dare un'occhiata al progetto open source, il servizio di sincronizzazione di OpenMobster. È possibile effettuare le seguenti operazioni di sincronizzazione

  • bidirezionale
  • a senso unico client
  • a senso unico dispositivo
  • avvio

Oltre a questo, tutte le modifiche sono tracciati e sincronizzati automaticamente con il Cloud. Puoi avere la tua app offline quando la connessione di rete non funziona. Troverà tutte le modifiche e automaticamente in background lo sincronizzerà con il cloud quando ritorna la connessione. Fornisce anche la sincronizzazione come iCloud su più dispositivi

Inoltre, le modifiche nel cloud vengono sincronizzate tramite notifiche push, quindi i dati sono sempre aggiornati anche se sono memorizzati localmente.

Nel tuo caso,

Criteria are speed (less network data exchange), robustness (data recovery in case update fails), offline access 
  • Velocità: solo le modifiche vengono inviate attraverso la rete in entrambe le direzioni

  • Robustezza: memorizza i dati in un negozio transazionale come SQLite e non riusciti gli aggiornamenti sono comunicati nel payload SyncML. Solo le operazioni di successo vengono elaborate, mentre le operazioni non riuscite sono ri-provato durante la prossima sincronizzazione

Ecco un link al progetto open source: http://openmobster.googlecode.com

Ecco un link per iPhone App Sync: http://code.google.com/p/openmobster/wiki/iPhoneSyncApp

Problemi correlati