Memorizzo un timestamp dell'ultima modifica nel database sia sui record di dati principali sul telefono che sulle tabelle mysql sul server.
Il telefono cerca tutto ciò che è cambiato dall'ultima sincronizzazione e lo invia al server insieme a un timestamp dell'ultima sincronizzazione, e il server risponde con tutto ciò che è cambiato alla fine dal timestamp di sincronizzazione fornito.
Le prestazioni sono un problema quando molti record sono cambiati. Eseguo la sincronizzazione su un NSOpeartion in background che ha il proprio contesto di oggetti gestiti. Quando il thread in background ha terminato di apportare modifiche al contesto dell'oggetto gestito, è disponibile un'API per unire tutte le modifiche nel contesto dell'oggetto gestito del thread principale, che può essere configurato per eliminare semplicemente tutte le modifiche in caso di conflitti causati da l'utente modifica i dati mentre la sincronizzazione è in corso. In tal caso, aspetto solo qualche secondo e poi provo a eseguire di nuovo una sincronizzazione.
Su hardware più vecchio anche dopo molte ottimizzazioni era necessario interrompere completamente la sincronizzazione se l'utente iniziava a fare cose nell'app. Stava semplicemente usando troppe risorse di sistema. Penso che i dispositivi iOS più moderni siano probabilmente abbastanza veloci da non dover più farlo.
(a proposito, quando ho detto "molti record sono cambiati" intendevo circa 30.000 righe aggiornate o inserite nel telefono)