2010-07-26 18 views
6

Ich verwende CoreData in meiner neuesten iPhone App. Ich finde es am Anfang komplex, aber ich denke, das ist die beste Wahl, wenn Sie Objekte in einer iPhone App (http://inessential.com/2010/02/26/on_switching_away_from_core_data) speichern müssen.CoreData Best Practices

Gibt es Best Practices bei der Verwendung von CoreData in einer iPhone App? Zum Beispiel möchte ich nicht, dass alle meine Controller mit diesem NSManagedObjectContext umgehen, den Sie benötigen, wenn Sie Anfragen stellen möchten. Definieren Sie eine Klasse nur für CoreData-Anforderungen?

+0

Dank BoltClock, wusste ich nicht über diese Funktion! –

+0

mögliches Duplikat von [Speicherort für den "Core Data Stack" in einer Cocoa/Cocoa Touch-Anwendung] (http://stackoverflow.com/questions/1267520/where-to-place-the-core-data-stack-in) -a-Kakao-Kakao-Touch-Anwendung) –

Antwort

6

ich in der Regel ein spezielles Objekt erstellen, um meine Core Data-Stack und verwandte Objekte und Verhaltensweisen zu verwalten. Dies ist nützlich, da es eine große Kesseltafel mit Core-Daten gibt, sodass ich eine generische Base-Manager-Klasse erstellen und dann für jede App eine Unterklasse verwenden kann. Ich nenne es normalerweise AppNameDataModel.

Ich lieber den Kontext des verwalteten Objekts im DataModel-Objekt ausblenden. Dadurch werden die anderen Objekte in der App gezwungen, das DataModel-Objekt nach dem Zugriff auf den Core Data-Stack zu fragen, wodurch eine gute Kapselung und Sicherheit erreicht wird.

Normalerweise erstelle ich Methoden in der DataModel-Klasse, um Abrufe für Entitäten zurückzugeben, z.

-(NSFetchRequest *) entityNameFetch; 

... und dann eine performFetch Methode im Datenmodell. Bei der Verwendung fragt ein Controller nach einem Abruf für eine Entität, konfiguriert den Abruf und fordert dann das Datenmodell auf, den Abruf durchzuführen und die Ergebnisse zurückzugeben. Sie können Skripts für die Generierung der Methoden erstellen, die die Felder fetch und perform fetch zurückgeben. Dies spart vor allem beim Prototyping viel Zeit.

Ein Verweis auf DataModel-Instanz selbst kann von Controller zu Controller übergeben werden, aber ich denke, dies ist eine gültige Verwendung des Singleton-Muster, so dass ich oft das DataModel ein Singleton und die Bereitstellung einer Kategorie auf UIViewController für eine Eigenschaft, um darauf zuzugreifen .Das bedeutet, dass jeder View-Controller, den ich dem Projekt hinzufüge, automatisch auf das DataModel zugreifen kann.

Dieses Muster hält alles schön verkapselt und modular. Es erleichtert das Hinzufügen neuer Ansichten oder das Teilen des Datenmodells zwischen Projekten. Es braucht ein wenig Arbeit, um es einzurichten, aber sobald Sie die Basisklasse haben, wird die zukünftige Nutzung massiv beschleunigt.

1

Danke Brad für das Zeigen auf diese Frage.

Wie in der Apple-Dokumentation [1] erwähnt, muss der Kontext an jeden neuen View-Controller übergeben werden, der CoreData benötigt.

Auf dem iPhone:

Vereinbarungsgemäß können Sie einen Kontext aus einem View-Controller erhalten oft. Es liegt aber an Ihnen, diesem Muster zu folgen. Wenn Sie einen View-Controller implementieren, der in Core Data integriert ist, können Sie eine NSManagedObjectContext-Eigenschaft hinzufügen.

Ein Ansichtscontroller sollte den Kontext normalerweise nicht von einem globalen Objekt wie dem Anwendungsdelegaten abrufen. Dies führt dazu, dass die Anwendungsarchitektur starr wird. Auch sollte ein View-Controller normalerweise keinen Kontext für seine eigene Verwendung erstellen. Dies kann bedeuten, dass Operationen, die unter Verwendung des Kontextkonzepts des Controllers ausgeführt werden, nicht in anderen Kontexten registriert sind, so dass unterschiedliche Ansichtscontroller unterschiedliche Perspektiven auf die Daten haben.

Wenn Sie einen View-Controller erstellen, übergeben Sie ihm einen Kontext. Sie übergeben einen vorhandenen Kontext oder (in einer Situation, in der der neue Controller einen separaten Satz von Änderungen verwalten soll) einen neuen Kontext, den Sie für ihn erstellen. In der Regel liegt es in der Verantwortung des Anwendungsdelegaten, einen Kontext zu erstellen, der an den ersten angezeigten Ansichtscontroller übergeben wird.

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