9

Im Erstellen einer App, die ein Core Data Model verwenden wird. Ich bin ziemlich neu bei Objective C und meine üblichen Design Patterns treffen nicht wirklich auf Core Data und Objective C zu, zumindest kann ich keine Beispiele finden, die das bestätigen.Entwurfsmuster für Core Data iPhone App

Ich habe durch die Apple Developer Beispiele und verschiedene Quellen auf den Intertubes gewesen.

Es scheint, dass ich Core Data zu nutzen, müssen die managedObjectContext jedem meiner Viewcontrollers, die Viewcontroller die NSFetchedResultsControllerDelegate implementieren müssen passieren und dann jede der Methoden implementieren für eine Abruf tun und implementieren anschließend

NSFetchedResultsChangeInsert 

NSFetchedResultsChangeDelete NSFetchedResultsChangeMove NSFetchedResultsChangeUpdate

Dies fügt etwa 100 + Zeilen Code in jedem Viewcontroller, und es ist 90% der gleiche Code, den ich immer wieder schreiben. Außerdem muss ich alles weitergeben und den Speicherbedarf verfolgen.

In anderen Sprachen würde ich ein Singleton-Modell aus einigen Klassen erstellen, das Methoden für die Wartung und Bereitstellung von Daten auf Anfrage bereithält, die von überall verfügbar sind. Es scheint, dass ich diesen Ansatz in Objective C nicht verwenden kann. Wenn ich eine statische Klasse erstellen möchte, die einen managedObjectContext verwendet und mir zurückgegeben hat, was ich brauche, müsste ich den managedObjectContext immer noch an jede Ansicht weitergeben, und das wäre es auch nicht asynchron wie wenn ich Delegate-Methoden implementiere, die gerade aufgerufen werden, wenn ein Ergebnis bereit ist.

Ich hoffe, dass dies Sinn macht und dass jemand entweder bestätigen kann, dass es keinen anderen vernünftigen Weg gibt, dies zu tun, oder mir helfen, in eine Richtung zu zeigen, dies gut zu verpacken.

+0

Eine ähnliche Frage wurde hier gefragt, die auch hilfreich sein könnten: http://stackoverflow.com/questions/1267520/where-to-place-the-core-data-stack-in-a-cocoa-cocoa- Touch-Anwendung –

Antwort

19

Core Data :) Danke ist nicht annähernd so kompliziert, wie Sie beschreiben.

Im Allgemeinen hat eine iPhone-App einen "Haupt" -Kontrollobjektkontext, der in der Regel dem App-Delegaten gehört. Solange Sie den App-Delegaten abrufen können (Hinweis: [[UIApplication sharedApplication] delegate]), haben Sie Zugriff auf den Kontext des verwalteten Objekts. Ich möchte eine statische globale Variable definieren, die einen Verweis auf meinen App-Delegaten enthält, um das Leben einfacher zu machen.

Es gibt im Allgemeinen eine Eins-zu-eins-Entsprechung zwischen NSFetchedResultsController Instanzen und UITableView Instanzen. Abgesehen davon, dass Tabellenansichten gefüllt werden, ist es äußerst selten, dass Sie eine NSFetchedResultsController benötigen. Wenn Sie mehrere ähnliche Ansichten haben (z. B. eine Tab-Leiste, mit der Sie die gleichen Daten auf verschiedene Arten wie bei der iPod-App anzeigen können), müssen Sie eine einzelne Basisklasse erstellen, die NSFetchedResultsController konfiguriert und Ihre spezifischen View-Controller ableitet davon.

Wenn Sie View-Controller zum Bearbeiten eines Objekts erstellen, ist es im Allgemeinen eine gute Idee, dies in einem separaten Kontext für verwaltete Objekte zu tun. Wenn der Benutzer abbricht, verwerfen Sie einfach den Kontext und die Änderungen gehen verloren. Auch hierfür benötigen Sie kein NSFetchedResultsController, da diese Ansichten nur ein einzelnes Objekt betreffen.

Wenn Sie fertig sind, bearbeiten Sie den Kontext des verwalteten Objekts save:. Die Objekte, die Ihre anderen verwalteten Objektkontexte verwalten, sollten die Methoden NSFetchedResultsControllerDelegate implementieren, um die Tabellenansicht synchron zu halten. Auch dies kann in einer Basisklasse implementiert werden, sodass Sie diese Funktionalität für zugehörige View-Controller verallgemeinern können.

+0

Bitte, können Sie ein Beispiel dafür geben, wie diese Basisklasse sein sollte? – Esteve

0

Müssen Sie unbedingt ein Coredata-Modell verwenden, oder würden etwas mit einem NSCoder (NSArchiver, NSKeyedArchiver, usw.) arbeiten? Ich habe festgestellt, dass CoreData für die meisten Anwendungen übertrieben ist.

Auch könnten Sie erklären, warum Sie nicht einen Ansatz mit Singletons nehmen können? Ich habe Singleton-Fabriken in einer Reihe von Anwendungen ohne Probleme verwendet. Es ist ziemlich einfach, Methoden auf Klassenebene zu definieren, die auf einer gemeinsamen (Singleton) -Instanz arbeiten.

+0

Alex du hast Recht :) Ich habe den resultsController ein wenig aus Proportionen verblasen, weil ich 3 Tabellenansichten miteinander verkettet hatte, in allen anderen Ansichten wäre ein resultsController sinnlos. Daher ist die Verwendung des managedObjectContext-Objekts, das in meinem Anwendungsdelegaten über [UIApplication sharedApplication] -Delegat] instanziiert wird, der Weg, der sinnvoll ist, ein bisschen wie ein Singleton. D Carney, werde ich ein ziemlich großes Modell werden beibehalten und es wird gegen einen Web-Service-Belichtung eines Modells wie es (eine lokale und globale Version meiner Daten) synchronisieren, so fühle ich mich wie der Stoff, Kerndaten ist. – RickiG

+0

Ich bin nicht sicher, dass der Singleton-Ansatz nicht funktionieren würde, aber ich würde wahrscheinlich Timing-Probleme bekommen, wenn die Daten nicht bereit waren oder nicht gespeichert werden konnten. Danke euch beiden, ich glaube, ich auf ManagedObjectContexts und die Alternativen zu Core Data :) – RickiG

+0

Methoden etwas klarer Sicht bekam, die, nicht Klassenmethoden sind von Instanzmethoden auf einer Singleton-Instanz arbeiten. –