Jag lagrar en senast ändrad tidsstämpel i databasen på både kärndataposterna på telefonen och mysql-tabellerna på servern.
Telefonen söker efter allt som har ändrats sedan den senaste synkroniseringen och skickar det upp till servern tillsammans med en tidsstämpel för den senaste synkroniseringen, och servern svarar med allt som har ändrats sedan den angivna synkroniseringens tidsstämpel.
Prestanda är ett problem när många skivor har förändrats. Jag gör synkroniseringen på en NSOpeartion i bakgrunden som har sin egen hanterade objektkontext. När bakgrundstråden har gjort ändringar i sin hanterade objektkontext finns det ett API för att slå samman alla ändringar i huvudtrådens hanterade objektkontext - som kan konfigureras för att helt enkelt kasta bort alla ändringar om det finns några konflikter orsakade av användaren ändrar data medan synkroniseringen pågår. I så fall väntar jag bara några sekunder och försöker sedan göra en synkronisering igen.
På äldre hårdvara var det även efter många optimeringar nödvändigt att avbryta synkroniseringen helt om användaren börjar göra saker i appen. Det använde helt enkelt för många systemresurser. Jag tror att mer moderna iOS-enheter förmodligen är tillräckligt snabba så att du inte behöver göra det längre.
(förresten, när jag sa "många poster har ändrats" menade jag att 30 000 eller så rader uppdateras eller infogas i telefonen)