2013-04-14 10 views
5

problem:Rdzeń danych vs NSFileManager

używam jakiegoś czasu mój własny system cache za pomocą NSFileManager. Zwykle dane, które otrzymuję, to JSON, a ja po prostu zapisuję słownik bezpośrednio w pamięci podręcznej (w folderze Dokumenty). Kiedy będę go potrzebować, po prostu go wezmę. Wdrażam też, czasami, gdy czuję, że jest lepiej, NSDictionary w folderze głównym z kluczami/wartościami dla ścieżki dla danego zasobu. Na przykład:

Zasób o pogodzie w Genewie 17/02/2013, więc chciałbym mieć klucz o nazwie GE_17_02_2013 i wartość ścieżki do NSDictionary z informacją.

Zwykle nie potrzebuję żadnych skomplikowanych zapytań. Ale w jakiś sposób iz tego, co czytałem, kiedy masz dużo danych, powinieneś trzymać się Core Data. W moim przypadku zwykle mam dużo danych, ale nigdy nie czułem, że aplikacja zanika lub cierpi pod względem wydajności. Więc moje pytania to:

  1. W tym przypadku, w którym czasami (rzecz pogoda była tylko przykładem ) muszę po prostu usunąć wszystkie dane (kanał Twittera, na przykład) i zastąpienie go przez całkowicie nowy strumień danych, jest Core Dane warte? Myślę, że usunięcie wszystkich danych i wstawienie (wypełnienie) tego jest cięższe niż przechowywanie NSDictionary i zastępowanie starego.

  2. Czasami byłoby envolve zdjęć, plików tekstowych, etc i NSFileManager robi to doskonale, więc jakie korzyści mogłoby przynieść podstawowe Dane w takich przypadkach?

P.S: Widziałem tylko this post, gdzie tego rodzaju pytanie jest wykonany i numery udowodnić, który z nich jest rzeczywiście szybciej. Mimo to chciałbym również odpowiedzi empirycznej.

Odpowiedz

2

Podstawowe dane są warte użycia w każdym scenariuszu, który opisałeś. W rzeczywistości, jeśli aplikacja przechowuje więcej niż preferencje, prawdopodobnie powinieneś używać danych podstawowych. Oto kilka powodów, wśród których znajdziesz odpowiedzi na swoje własne problemy:

  • jest zdecydowanie szybsza niż w systemie plików, nawet jeśli wymazać wszystko i zapisać go ponownie, jak opisać (więc nie zrobić wiele korzyści z buforowania). Dzieje się tak głównie dlatego, że można połączyć operacje i uzyskać dostęp do sklepu tylko w razie potrzeby. Więc jeśli czytasz, piszesz i czytasz, możesz zaoszczędzić tylko raz, reszta odbywa się w pamięci, co jest, rzecz jasna, bardzo szybkie.
  • wszystko jest wersjonowane i można łatwo migrować z jednej wersji do drugiej (przy zachowaniu zawartości użytkownika na urządzeniu).
  • 80% operacji wykonywanych przez model jest darmowe. Podobnie, gdy coś się zmienia, można zastąpić metodę zarządzanego obiektu willSave i powiadomić kontrolery.
  • użyciu cascade sprawia, że ​​błahe usunąć nawet bardzo złożonych struktur obiektów
  • natomiast jest to zły pomysł, aby zachować obrazy w bazie danych, nadal można przechowywać je w systemie plików i mieć podstawowe dane automatycznie usunąć je, gdy udało obiekt, który reprezentuje je jest usuwany
  • jest elastyczny, w rzeczywistości jest tak elastyczny, że można migrować swój projekt z wykorzystaniem lokalnego systemu plików do korzystania z serwera z niewielkimi modyfikacjami, pisząc niestandardowy magazyn danych.
  • Główny projektant danych zasadniczo tworzy dla Ciebie obiekty modelu. Nie trzeba tworzyć własne klasy modelu (które trzeba by w przypadku korzystania z systemu plików)
+0

Pamięć podręczna jest bardziej przeznaczona do scenariuszy offline. Tak więc w normalnych warunkach z dostępem do Internetu zwykle zastępuję przechowywane dane bardzo często, dlatego miałem obawy. Kolejną zaletą jest fakt, że używa się 'NSDictionary' i nie ma potrzeby, aby wiedzieć, co jest w jego środku (jak jest skomponowany). Czy miałoby sens posiadanie 'NSManagedObject' z tylko' NSDictionary'? – Peres

+0

Pamięć podręczna jest ważna również dla lokalnego systemu plików. Dostęp do systemu plików jest znacznie wolniejszy niż dostęp do pamięci. Nie jestem pewien, dlaczego nie musisz wiedzieć, co jest w słowniku, nie czytaj/nie interpretuj tego jako punktu.Jeśli przechowujesz plik tylko jakikolwiek inny, który jest serializowanym słownikiem, to tak, nie ma sensu używać Core Data –

+0

To znaczy, wiem, co jest w środku, ale jeśli z jakiegoś powodu API się zmieni i doda inne rzeczy , Nie jestem do tego ograniczony. – Peres

1

W tym przypadku ... to podstawowe dane warto?

Tak, w zakresie, w jakim potrzebujesz czegoś bardziej centralnie zarządzanego niż próba stworzenia własnego schematu systemu plików. Core Data i jego kuzyni SQL niższego poziomu nadal są najlepszym wyborem dla trwałości, którą mamy teraz. Poza tym wydajność wydajności korzystania z NSKeyed(Un)Archiver w celu ciągłego serializowania/deserializacji słownika staje się coraz bardziej zauważalna w przypadku większych zestawów danych.

myślę, usuwając wszystkie dane i wstawianie (wypełniania) to jest cięższy niż tylko przechowywać NSDictionary i zastąpienie starego.

Absolutnie, tak. Ale nie musisz myśleć o obrotach pamięci podręcznej w ten sposób. Jeśli wyobrażasz sobie Core Data jako model statyczny, możesz wykorzystać warstwę pamięci podręcznej do przesyłania danych do sklepu i ze sklepu. Potrzebujesz tego zasobu na temat pogody? Sprawdź warstwę pamięci podręcznej. Jeśli go tam nie ma, uruchom pamięć podręczną w celu pobrania. Potrzebujesz obrócić całą pamięć podręczną? Niech pamięć podręczna będzie pusta, a następnie uruchom żądanie oznaczenia każdej jednostki za pomocą jakiejś flagi, aby pokazać, że są one nieprawidłowe. Kosztowne usuwanie, o które się martwisz, może zostać wykonane w tle, gdy zobaczysz, że wszystkie twoje nowe dane zostały bezpiecznie internowane w pamięci podręcznej.

Czasami byłoby envolve zdjęć, plików tekstowych, etc i NSFileManager robi to doskonale, więc jakie korzyści Rdzeń danych może przynieść w tym przypadku?

Niestety, nie wiele. W przypadku blobów danych (co zasadniczo ma miejsce w przypadku danych podstawowych w takich sytuacjach), przechowywanie i pobieranie danych do iz danych podstawowych może szybko stać się kosztowne. Mogą również zajmować zauważalnie większą przestrzeń na dysku, jeśli nie są skompresowane (co jeszcze bardziej zmniejsza wydajność). Jeśli potrzebujesz szybszej alternatywy, użyj sklepu bardziej dopasowanego do zadania, takiego jak Tokyo Cabinet lub LevelDB, i użyj elementów w magazynie danych podstawowych jako swego rodzaju stand-in, który może zawierać klucz do zasobu w jednym z te relacyjne bazy danych.

+0

Używam tego mechanizmu (unieważnienia) przy użyciu podejścia 'NSFileManager'. Z dużą ilością danych. Dzięki za wkład Robert. – Peres

Powiązane problemy