2010-07-26 21 views
6

Używam CoreData w mojej najnowszej aplikacji na iPhone'a. Uważam, że jest to skomplikowane na początku, ale sądzę, że jest to najlepszy wybór, gdy trzeba przechowywać obiekty w aplikacji na iPhone'a (http://inessential.com/2010/02/26/on_switching_away_from_core_data).Najlepsze praktyki CoreData

Czy są jakieś sprawdzone metody korzystania z CoreData w aplikacji na iPhone'a? Na przykład, nie chcę, aby wszystkie moje kontrolery radziły sobie z tym NSManagedObjectContext, który jest potrzebny, gdy chcesz wysyłać żądania. Czy definiujesz klasę tylko dla żądań CoreData?

+0

Dzięki BoltClock, nie wiedziałem o tej funkcji! –

+0

możliwy duplikat [Gdzie umieścić "Stos danych podstawowych" w aplikacji Cocoa/Cocoa Touch] (http://stackoverflow.com/questions/1267520/where-to-place-the-core-data-stack-in -kontakt z kakao-dotykiem) –

Odpowiedz

6

zazwyczaj tworzę obiekt dedykowany do zarządzania moim stosu danych Core i pokrewnych przedmiotów i zachowań. Jest to użyteczne, ponieważ istnieje wiele płyt kotła z Core Data, więc mogę utworzyć ogólną klasę menedżera bazy, a następnie użyć podklasy dla każdej aplikacji. Zwykle nazywam to AppNameDataModel.

Wolę ukryć kontekst obiektu zarządzanego wewnątrz obiektu DataModel. Zmusza to inne obiekty w aplikacji do zapytania obiektu DataModel o dostęp do stosu danych podstawowych, co zapewnia dobre hermetyzowanie i bezpieczeństwo.

Zazwyczaj tworzę metody w klasie DataModel w celu zwrócenia pobrań dla podmiotów np.

-(NSFetchRequest *) entityNameFetch; 

... a następnie użyj metody performFetch w DataModelu. W użyciu kontroler prosi o pobranie dla jednostki, konfiguruje pobieranie, a następnie prosi DataModel o wykonanie pobierania i zwrócenie wyników. Można skryptować generację metod, które zwracają pobranie, a pobranie wykonania jest również płytą kotła. To wszystko oszczędza dużo czasu, zwłaszcza podczas tworzenia prototypów.

Odwołanie do samej instancji DataModel można przekazać z kontrolera do kontrolera, ale myślę, że jest to poprawne użycie wzorca singleton, więc często robię model danych singleton i dostarczam kategorię na UIViewController dla właściwości, aby uzyskać do niej dostęp .Oznacza to, że każdy kontroler widoku dodany do projektu automatycznie ma dostęp do modułu DataModel.

Ten wzór zachowuje wszystko ładnie zamknięte i modułowe. Ułatwia dodawanie nowych widoków lub udostępnianie modelu danych między projektami. Wykonanie początkowo zajmuje trochę pracy, ale gdy już masz klasę podstawową, przyszłe użycie znacznie przyspieszy.

1

Dzięki Brad za wskazanie tego pytania.

Jak wspomniano w dokumentacji Apple [1], kontekst musi zostać przekazany do każdego nowego kontrolera widoku, który potrzebuje CoreData.

Na iPhone:

Umownie można często uzyskać kontekst z kontrolera widoku. Od Ciebie zależy jednak od tego wzoru. Po zaimplementowaniu kontrolera widoku, który integruje się z danymi podstawowymi, można dodać właściwość NSManagedObjectContext.

Kontroler widoku zazwyczaj nie powinien pobierać kontekstu z obiektu globalnego, takiego jak delegat aplikacji. Powoduje to, że architektura aplikacji jest sztywna. Ani kontroler widoku zwykle nie tworzy kontekstu do własnego użytku. Może to oznaczać, że operacje wykonywane przy użyciu kontekstu kontrolera nie są rejestrowane w innych kontekstach, więc różne kontrolery widoku będą miały różne perspektywy danych.

Po utworzeniu kontrolera widoku przekazuje się kontekst. Przekazujesz istniejący kontekst lub (w sytuacji, w której nowy kontroler ma zarządzać oddzielnym zestawem zmian) nowy kontekst, który dla niego stworzysz. Zazwyczaj zadaniem delegata aplikacji jest utworzenie kontekstu, który przejdzie do pierwszego wyświetlanego kontrolera widoku.

[1] - http://developer.apple.com/iphone/library/documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/stack.html#//apple_ref/doc/uid/TP40008283