Pracowałem nad metodą synchronizacji podstawowych danych przechowywanych w aplikacji iPhone'a między wieloma urządzeniami, takimi jak iPad lub Mac. Nie ma wielu (jeśli w ogóle) ram synchronizacji do użycia z Core Data na iOS. Zastanawiałem się jednak nad następującą koncepcją:
- Dokonano zmiany w lokalnym podstawowym magazynie danych, a zmiana została zapisana. (a) Jeśli urządzenie jest w trybie online, próbuje wysłać zestaw zmian na serwer, w tym identyfikator urządzenia, które wysłało zestaw zmian. (b) Jeśli zestaw zmian nie dotrze do serwera lub urządzenie nie jest w trybie online, aplikacja doda zestaw zmian do kolejki do wysłania, gdy przejdzie w tryb online.
- Serwer siedzący w chmurze łączy określone zestawy zmian, które otrzymuje, ze swoją główną bazą danych.
- Po scaleniu zestawu zmian (lub kolejki zestawów zmian) na serwerze w chmurze serwer wypycha wszystkie te zestawy zmian na inne urządzenia zarejestrowane na serwerze za pomocą pewnego rodzaju systemu odpytywania. (Myślałem o skorzystaniu z usług Push Apple, ale najwyraźniej według komentarzy nie jest to realny system).
Czy jest coś wymyślonego, o czym muszę pomyśleć? Patrzyłem na frameworki REST, takie jak ObjectiveResource , Core Resource i RestfulCoreData . Oczywiście wszystkie one współpracują z Ruby on Rails, z którymi nie jestem związany, ale jest to miejsce na początek. Główne wymagania, jakie mam dla mojego rozwiązania, to:
- Wszelkie zmiany należy przesyłać w tle bez wstrzymywania głównego wątku.
- Powinien wykorzystywać możliwie najmniejszą przepustowość.
Myślałem o wielu wyzwaniach:
- Upewnij się, że identyfikatory obiektów dla różnych magazynów danych na różnych urządzeniach są dołączone na serwerze. To znaczy, będę mieć tabelę identyfikatorów obiektów i identyfikatorów urządzeń, które są powiązane poprzez odwołanie do obiektu przechowywanego w bazie danych. Będę miał rekord (DatabaseId [unikalny dla tej tabeli], ObjectId [unikalny dla elementu w całej bazie danych], Datafield1, Datafield2), pole ObjectId będzie odnosić się do innej tabeli, AllObjects: (ObjectId, DeviceId, DeviceObjectId). Następnie, gdy urządzenie wypchnie zestaw zmian, przekaże identyfikator urządzenia i identyfikator obiektu z podstawowego obiektu danych w lokalnym magazynie danych. Następnie mój serwer w chmurze sprawdzi obiekt ID i identyfikator urządzenia w tabeli AllObjects i znajdzie rekord do zmiany w tabeli początkowej.
- Wszystkie zmiany powinny być oznaczone datą, aby można je było scalić.
- Urządzenie będzie musiało sondować serwer bez zużywania zbyt dużej baterii.
- Lokalne urządzenia będą również musiały aktualizować wszystko, co jest w pamięci, jeśli / kiedy zmiany zostaną otrzymane z serwera.
Czy brakuje mi czegoś jeszcze? Na jakie ramy powinienem spojrzeć, aby było to możliwe?