2010-06-06 20 views
7

Pracuję nad zwykłą aplikacją na iPhone'a, która pobiera dane z serwera (XML, JSON itp.) I zastanawiam się, jaki jest najlepszy sposób na wdrożenie danych synchronizujących . Kryteria to szybkość (mniejsza wymiana danych w sieci), solidność (odzyskiwanie danych w przypadku niepowodzenia aktualizacji), dostęp w trybie offline i elastyczność (można dostosować, gdy struktura bazy danych ulega niewielkim zmianom, np. Nowa kolumna). Wiem, że to zależy od aplikacji, ale czy możesz podzielić się swoją strategią/doświadczeniem?Najlepsza strategia synchronizowania danych w aplikacji iPhone'a

Dla mnie, mam na myśli coś takiego:

1) Sklep data ostatniej modyfikacji w iPhone

2) Po uruchomieniu, wysłać wiadomość jak getNewData.php lastmodifieddate = ...?

3) Serwer przetworzy i wyśle ​​tylko zmodyfikowane dane z ostatniego czasu.

4) Te dane są formatowane jako tak:

<+><data id="..."></data></+> // add this to SQLite/CoreData

<-><data id="..."></data></-> // remove this

<%><data id="..."><attribute>newValue</attribute></data></%> // new modified value

Nie chcę, aby < +>, < ->, <%> ... także dla każdego atrybutu, ponieważ byłoby to zbyt skomplikowane, więc prawdopodobnie po odebraniu pola <%> po prostu usunę dane z określonym identyfikatorem, a następnie dodaj go ponownie (zakładając, że id tutaj nie jest polem automatycznie automatycznie zwiększanym).

5) Gdy wszystko zostanie pobrane i zaktualizowane, zaktualizuję pole Ostatnia modyfikowana data.

Głównym problemem związanym z tą strategią jest: Jeśli sieć ulegnie awarii podczas aktualizacji czegoś => Ostatnia aktualizacja daty nie została jeszcze zaktualizowana => następnym razem, gdy uruchomię ponownie aplikację, będę musiał przejść przez to samo jeszcze raz. Nie wspominając o potencjalnie niespójnych danych. Jeśli użyję tabeli tymczasowej do aktualizacji i sprawię, że cała sprawa będzie atomowa, to będzie działać, ale potem znowu, jeśli aktualizacja jest zbyt długa (wiele zmian danych), użytkownik musi długo czekać, aż nowe dane będą dostępne. Czy powinienem używać Stopnio-Zmodyfikowanej daty dla każdego pola danych i aktualizować dane stopniowo?

Odpowiedz

2

Zacznę od rutynowej aktualizacji, ponieważ będziesz miał dość na rękach, aby dowiedzieć się, jak poprawnie działa komunikacja klient-serwer.

Po tym jest dobry moment, aby rozważyć ulepszenie go jako przyrostowe, ale dopiero po wykonaniu niektórych testów, aby dowiedzieć się, czy jest to naprawdę konieczne. Jeśli dostosowujesz protokół aktualizacji tak, aby był jak najmniejszy przepustowość, możesz odkryć, że nawet "duża" aktualizacja jest pobierana wystarczająco szybko.

Innym sposobem na sprawdzenie jest pytanie, jak często będą występować problemy z siecią, gdy przeciętny użytkownik robi synchronizację? Prawdopodobnie nie chcesz dostroić się do mało prawdopodobnych scenariuszy.

Jeśli próbujesz zoptymalizować (zminimalizować) transfer danych, możesz rozważyć inny format niż XML, ponieważ XML jest dość obszerny. Lub przynajmniej możesz chcieć zamienić czytelność XML w przestrzeni, poprzez uczynienie z nazwy każdego elementu i atrybutu tak małych, jak to możliwe, i wyeliminowanie niepotrzebnych białych znaków.

0

Twój podstawowy program jest dobry.To, co musisz zrobić, to w jakiś sposób uczynić swoje aktualizacje idempotentnymi, abyś mógł zrestartować częściowo ukończony transfer bez ryzyka. To jest lepszy sposób, niż próba wdrożenia jakiegoś prawdziwego zatwierdzenia atomowego (chociaż możesz to zrobić, używając np. Bazy danych SQLite).

Z naszego doświadczenia dość duże aktualizacje (10 KB) można dość szybko pobrać, jeśli serwer jest wystarczająco szybki. Nie ma potrzeby robienia aktualizacji na drobne kawałki. Ale na pewno nie zaszkodzi spróbować zminimalizować ilość przesyłanych danych, zachowując bardziej szczegółowe informacje o "ostatniej aktualizacji".

(I zdecydowanie należy użyć JSON, zamiast XML jako swojej reprezentacji przesyłanych danych.)

0

Wonder jeśli uznane za pomocą ramy Sync zarządzać synchronizację. Jeśli to interesuje, możesz rzucić okiem na projekt Open Source, usługę synchronizacji OpenMobster. Można wykonać następujące operacje Sync

  • dwukierunkowy
  • jednokierunkową klienta
  • jednokierunkowe urządzenie
  • bootup

Poza tym, wszystkie modyfikacje są automatycznie śledzone i synchronizowane z chmurą. Możesz wyłączyć swoją aplikację, gdy połączenie sieciowe nie działa. Śledzi wszelkie zmiany i automatycznie w tle synchronizuje je z chmurą po powrocie połączenia. Zapewnia również synchronizację, taką jak iCloud, na wielu urządzeniach.

Ponadto modyfikacje w chmurze są synchronizowane za pomocą powiadomień Push, więc dane są zawsze aktualne, nawet jeśli są przechowywane lokalnie.

W twoim przypadku,

Criteria are speed (less network data exchange), robustness (data recovery in case update fails), offline access 
  • Speed: Tylko zmiany są wysyłane przez sieć w obu kierunkach

  • solidność: Przechowuje dane w sklepie transakcyjnej jak SQLite oraz niepowodzeniem aktualizacje są przesyłane w pakiecie danych SyncML. Tylko udane operacje są przetwarzane podczas nieudane operacje są ponownie próbował podczas następnej synchronizacji

Tu jest link do projektu open source: http://openmobster.googlecode.com

Tu jest link do iPhone App Sync: http://code.google.com/p/openmobster/wiki/iPhoneSyncApp