Съхранявам последно променено времево клеймо в базата данни както на основните записи с данни на телефона, така и на mysql таблиците на сървъра.
Телефонът търси всичко, което се е променило след последното синхронизиране, и го изпраща до сървъра заедно с клеймо за дата на последното синхронизиране, а сървърът отговаря с всичко, което се е променило в края му след предоставения времеви печат за синхронизиране.
Производителността е проблем, когато много записи са се променили. Правя синхронизирането на фонов NSOpeartion, който има свой собствен контекст на управляван обект. Когато фоновата нишка приключи с промените в контекста на управлявания обект, има API за сливане на всички промени в контекста на управлявания обект на основната нишка - който може да бъде конфигуриран просто да изхвърли всички промени, ако има конфликти, причинени от потребителят променя данните, докато синхронизирането продължава. В такъв случай просто изчаквам няколко секунди и след това се опитвам да направя синхронизация отново.
При по-стар хардуер, дори след много оптимизации, беше необходимо да се прекъсне изцяло синхронизирането, ако потребителят започне да прави неща в приложението. Просто използваше твърде много системни ресурси. Мисля, че по-модерните устройства с iOS вероятно са достатъчно бързи, че вече не е нужно да правите това.
(между другото, когато казах „много записи са се променили“, имах предвид около 30 000 реда, които се актуализират или вмъкват в телефона)