Przechowuję ostatnią modyfikację znacznika czasu w bazie danych zarówno w podstawowych rekordach danych w telefonie, jak iw tabelach mysql na serwerze.
Telefon wyszukuje wszystko, co zmieniło się od ostatniej synchronizacji i wysyła je na serwer wraz ze znacznikiem czasu ostatniej synchronizacji, a serwer odpowiada wszystkim, co zmieniło się na jego końcu od czasu podanego znacznika czasu synchronizacji.
Wydajność jest problemem, gdy zmieniło się wiele rekordów. Synchronizuję na tle NSOpeartion, który ma własny kontekst obiektu zarządzanego. Gdy wątek w tle zakończy wprowadzanie zmian w kontekście obiektu zarządzanego, istnieje interfejs API do scalania wszystkich zmian z kontekstem obiektu zarządzanego głównego wątku — który można skonfigurować tak, aby po prostu odrzucał wszystkie zmiany, jeśli wystąpią jakiekolwiek konflikty spowodowane przez użytkownik zmienia dane podczas synchronizacji. W takim przypadku po prostu czekam kilka sekund, a następnie ponownie próbuję wykonać synchronizację.
Na starszym sprzęcie, nawet po wielu optymalizacjach, konieczne było całkowite przerwanie synchronizacji, jeśli użytkownik zaczął robić rzeczy w aplikacji. Po prostu używał zbyt wielu zasobów systemowych. Myślę, że bardziej nowoczesne urządzenia z iOS są prawdopodobnie na tyle szybkie, że nie musisz już tego robić.
(tak przy okazji, kiedy powiedziałem „wiele rekordów się zmieniło”, miałem na myśli 30 000 lub więcej wierszy aktualizowanych lub wstawianych do telefonu)