2011-08-09 10 views
7

Mam dość złożoną aplikację na iPhone'a, która korzysta z interfejsu API do pobierania danych z serwera i wyświetlania go użytkownikowi. Mam około 5 klas modeli, które są używane w całej aplikacji - po prostu rozszerzają NSObject.Dodawanie danych podstawowych do aplikacji iPhone z istniejącymi (zwykłymi) modelami

Chcę dodać pewne opory do modeli, aby umożliwić korzystanie z niektórych części aplikacji, nawet jeśli urządzenie jest w trybie offline - tak naprawdę jest to po prostu gloryfikowane buforowanie. Chcę tylko, aby pewne wystąpienia moich modeli były utrwalane - na przykład pozycje, które użytkownik utworzył w zakładek - a inne nie powinny, na przykład setki wyników wyszukiwania.

Czy Core Data to odpowiednie rozwiązanie? Trudności, które widzę, to:

  • Musiałbym zmienić sposób, w jaki uruchamiam obiekty modelu w całym projekcie. Będę musiał je zainicjować jako część kontekstu, co niekoniecznie ma sens, jeśli pochodzą one z zewnętrznego interfejsu API.
  • Będę musiał uważać, aby nie utrwalać instancji, których nie chcę. Wydaje się to sprowadza się albo do usuwania zarządzanego obiektu tuż po jej utworzeniu (bardzo niewygodne) lub za pomocą oddzielnego, nietrwałe kontekst przypadkach nie chcę trwali (lepsze, ale wciąż nieco niewygodne)

Miałem nadzieję, że będę mógł nadal korzystać z moich modeli w całej aplikacji, nie zmieniając kodu, który nie wymaga dbałości o utrzymanie, ale to nie wydaje się możliwe z uwagi na moje wymagania. Alternatywą jest utworzenie nowego zestawu obiektów zarządzanych równolegle z moimi istniejącymi obiektami i używanie obiektów zarządzanych wyłącznie w celu zachowania ciągłości - ale ten rodzaj duplikowania nigdy nie wydaje się właściwym rozwiązaniem.

Czy powinienem próbować dopasować Core Data do tego, a jeśli tak, to w jaki sposób? Czy powinienem po prostu przyjrzeć się innym opcjom - sqlite3 (wydaje się nieco skomplikowany dla tego, czego potrzebuję), domyślne ustawienia użytkownika (prawdopodobnie nie to, do czego są przeznaczone), a nawet serializowanie i pisanie własnych obiektów do plików (wydaje się hack-ish).

Dzięki za wszelkie dane wejściowe!

Odpowiedz

3

Dlaczego nie spojrzeć na NSKeyedArciver/Unarchiver? Powiedziałbym, że Core Data jest oczywistym rozwiązaniem w przypadku pracy z bardzo dużymi ilościami danych wraz z bazami danych sqlite, ale NSKeyedArchiver jest tym, czego używam do zapisywania modeli. Zapoznaj się z dokumentacją Apple here. Używanie NSKeyedArchiver to całkiem proste IMO i możesz przechowywać prawie wszystko, czego potrzebujesz.

+0

Dzięki! Nie mogę uwierzyć, że przegapiłem NSKeyArchiver. Zrobię to - może być dokładnie to, czego potrzebuję. –

+0

Nie ma problemu, cieszę się z pomocy (: –

1

W tej chwili tworzysz instancje obiektów danych jako podklasy obiektu NSObject. Można użyć innego poziomu niezależności, aby zdecydować, czy utworzyć obiekt jako podklasę ManagedObjectModel, i zachować większość aplikacji nietkniętą za pomocą protokołu określającego interfejs używany do uzyskiwania dostępu do informacji z tych obiektów, a następnie przekazując obiekty typu id<DataObjectProtocol> . Niepowodzenie pobierania będzie wskazaniem obiektu nielokalnego.

Alternatywnie można utworzyć wszystko jako obiekt zarządzany i po prostu nie zapisywać niczego poza kluczem do danych, których nie chcesz przechowywać lokalnie. Dzięki temu możesz wiedzieć, czy istnieje jakikolwiek obiekt i jak go pobrać w razie potrzeby, ale nie tracisz czasu ani miejsca na przechowywanie danych, które powinny pozostać w chmurze. Aby to zrobić, należy zdefiniować wszystkie oprócz klucza w modelu jako opcjonalne.

Wybrałbym Core Data ze względu na jego elastyczność, użyteczność i optymalizację. Naprawdę warto się uczyć. Nie polecałbym podejścia sqlite3, droga naprzód w systemie iOS to Core Data.Jeśli używasz jakiegoś magazynu plików, powinieneś pomyśleć o tym, jak robić wsady czytając i/lub zapisując, ponieważ możesz mieć problemy z wydajnością, wykonując wiele małych operacji na plikach.

+0

Dzięki, kilka dobrych pomysłów! Najpierw dam NSKeyedArchiver strzał, jak zasugerowano w innym komentarzu, ponieważ wygląda to prosto i nie powinno zająć więcej niż jeden dzień, aby go podłączyć. Mam z tym pewne problemy z wydajnością, jeśli to się nie uda, powrócę do czegoś podobnego do twoich sugestii. –

Powiązane problemy