Hej, pracuję tutaj nad warstwą modelu dla naszej aplikacji.
Oto niektóre wymagania:
- Powinien działać na iPhone OS 3.0+.
- Źródłem naszych danych jest aplikacja RESTful Rails.
- Powinniśmy buforować dane lokalnie przy użyciu danych podstawowych.
- Kod klienta (nasze kontrolery UI) powinien mieć jak najmniejszą wiedzę na temat jakichkolwiek rzeczy w sieci i powinien odpytywać / aktualizować model za pomocą interfejsu API podstawowych danych.
Sprawdziłem sesję WWDC10 117 dotyczącą tworzenia środowiska użytkownika opartego na serwerze, spędziłem trochę czasu na sprawdzaniu frameworków Objective Resource , Core Resource i RestfulCoreData .
Struktura zasobów celu nie komunikuje się samodzielnie z danymi podstawowymi i jest jedynie implementacją klienta REST. Zasoby podstawowe i RestfulCoreData zakładają, że rozmawiasz z danymi podstawowymi w swoim kodzie i rozwiązują one wszystkie nakrętki i śruby w tle na warstwie modelu.
Jak na razie wszystko wygląda dobrze i początkowo myślałem, że albo Core Resource, albo RestfulCoreData pokryją wszystkie powyższe wymagania, ale ... Jest kilka rzeczy, których żadna z nich nie wydaje się rozwiązać poprawnie:
- Główny wątek nie powinien być blokowany podczas zapisywania lokalnych aktualizacji na serwerze.
- Jeśli operacja zapisywania nie powiedzie się, błąd powinien zostać propagowany do interfejsu użytkownika i żadne zmiany nie powinny być zapisywane w lokalnym magazynie danych podstawowych.
Zdarza się, że zasób podstawowy wysyła wszystkie swoje żądania do serwera, gdy wywołujesz - (BOOL)save:(NSError **)error
kontekst obiektu zarządzanego, a zatem jest w stanie w jakiś sposób dostarczyć poprawną instancję NSError podstawowych żądań do serwera. Ale blokuje wątek wywołujący do zakończenia operacji zapisywania. ZAWIEŚĆ.
RestfulCoreData zachowuje -save:
połączenia bez zmian i nie wprowadza dodatkowego czasu oczekiwania na wątek klienta. Po prostu obserwuje, NSManagedObjectContextDidSaveNotification
a następnie wysyła odpowiednie żądania do serwera w module obsługi powiadomień. Ale ten sposób -save:
rozmowa zawsze zakończy się pomyślnie (dobrze, biorąc pod uwagę dane Core jest w porządku z zapisanymi zmianami) oraz kod klienta, że faktycznie nazywa to nie ma sposobu, by poznać oszczędzania może nie udało się rozchodzą się z serwerem z powodu niektórych 404
lub 421
czy cokolwiek Wystąpił błąd po stronie serwera. Co więcej, lokalna pamięć masowa zaczyna aktualizować dane, ale serwer nigdy nie wie o zmianach. ZAWIEŚĆ.
Więc szukam możliwego rozwiązania / wspólnych praktyk w radzeniu sobie z tymi wszystkimi problemami:
- Nie chcę, aby wątek wywołujący blokował się przy każdym
-save:
połączeniu podczas wykonywania żądań sieciowych. - Chcę w jakiś sposób otrzymywać powiadomienia w interfejsie użytkownika, że jakaś operacja synchronizacji poszła nie tak.
- Chcę, aby rzeczywiste zapisywanie danych podstawowych również się nie powiodło, jeśli żądania serwera nie powiodą się.
Jakieś pomysły?