4 Stimmen

Ist es sinnvoll, mehrere NSPersistentStoreCoordinators zu haben?

Ich bin neu bei Core Data und versuche sicherzustellen, dass ich mein Datenmodell und seine Verwendung richtig eingerichtet habe.

Ich habe im Grunde zwei Dateitypen in meiner App ... eine enthält Daten des Typs Einstellungen und eine zweite enthält Datensätze, mit denen der Benutzer arbeiten wird (ähnlich wie Dokumente, obwohl ich mir vorstellen kann, dass der Benutzer mit 10 oder sogar 100 dieser Dateien gleichzeitig arbeitet).

Ich habe Bücher über Kerndaten gelesen, und ich erinnere mich, dass ich gelesen habe, dass eine App typischerweise eine einzige NSPersistentStoreCoordinator eine einzige NSManagedObjectContext und eine einzige NSManagedObjectModel .

Ich habe derzeit ein einzelnes verwaltetes Objektmodell mit Konfigurationen für die verschiedenen Dateitypen, die ich habe. Ich hatte geplant, auch eine der NSPersistentStoreCoordinators / NSManagedObjectContexts und wenn ich neue Kerndatenobjekte erstelle, würde ich sicherstellen, dass jedes Objekt dem richtigen persistenten Speicher hinzugefügt wird.

Ich habe jedoch Beispiele gesehen, bei denen jede Datei eine eigene NSPersistentStoreCoordinator y NSManagedObjectContext .

Gibt es Vor- und Nachteile, wenn man mehrere Personen hat? NSPersistentStoreCoordinators y NSManagedObjectContexts in einer Single-Thread-Anwendung?

Ursprünglich hatte ich gehofft, Objekte während der Bearbeitung durch den Benutzer per Ausschneiden und Einfügen von einem dauerhaften Speicher in einen anderen verschieben zu können, aber das scheint so oder so nicht möglich zu sein.

Jeder Ratschlag ist sehr willkommen!

bearbeiten

Hier finden Sie weitere Informationen darüber, was mich verwirrt. Wenn ich die Dokumentation über NSPersistentStoreCoordinator lese, steht dort:

Der Koordinator soll Folgendes präsentieren eine Fassade für das verwaltete Objekt Kontexten eine Fassade zu bieten, so dass eine Gruppe von persistenten Gesamtspeicher erscheint.

In meinem Fall ist das nicht das, was ich will. Ich möchte, dass meine Dokumente als separate Dokumente wahrgenommen werden, und ich möchte nicht, dass die Abfragen miteinander verwechselt werden.

Wenn ich bei nur einem Koordinator für persistente Speicher und vielen persistenten Speichern vergesse, eine Entität bei der Erstellung dem richtigen Speicher zuzuordnen, treten Fehler auf, da Entitäten bei ihrer Erstellung willkürlich einem gültigen Speicher zugeordnet werden. Ich bin mir nicht sicher, was mit Beziehungen passieren würde, die auf Objekte in verschiedenen Speichern verweisen (wahrscheinlich ein Assertion-Fehler?).

Mir scheint, dass ein einziger Kontext / persistenter Speicherkoordinator pro Speicher weniger anfällig für Fehler ist und es mir ermöglicht, die Daten für jedes Dokument voneinander isoliert zu halten.

Das Einzige, was mir ein einzelner persistenter Speicher zu bringen scheint, ist, dass ich einen Speichervorgang für alle Speicher gleichzeitig durchführen kann, was vorzuziehen wäre. Mit mehreren Kontexten/Speicher-Koordinatoren müsste ich separate Speichervorgänge durchführen.

Wenn Sie die OSX NSPersistentDocument-Klasse verwenden, scheint sie einen separaten Kontext/Speicher-Koordinator pro Dokument zu erzwingen.

Wie auch immer, aus all meinen Recherchen, scheint es, dass separate Store-Koordinatoren / Kontexte besser für meine App funktionieren würde, aber der Grund, warum ich dies gepostet ist, weil ich bin neu in Core Data und dieser Ansatz scheint gegen den empfohlenen Fluss zu gehen und ich bin besorgt, dass ich einige gotchas, die zurück kommen, um mich zu beißen übersehen bin.

Weitere Überlegungen/Informationen

Während ich weiter darüber nachdenke und mehr Rückmeldungen von anderen lese (vielen Dank an alle!!!), sind meine derzeitigen Gedanken wie folgt.

Für mich selbst scheint es keinen großen Unterschied zwischen den beiden Ansätzen zu geben, und ich glaube, dass ich es so oder so gut hinbekommen würde.

Mit einem einzigen Store-Koordinator muss ich sicherstellen, dass neu erstellte Entitäten mit dem richtigen Store verbunden sind (keine große Sache). Mit mehreren Filialkoordinatoren muss ich sicherstellen, dass neu erstellte Entitäten dem richtigen Kontext hinzugefügt werden (wovon ich viele haben werde). Mit der Art und Weise, wie mein Code strukturiert ist, sollten beide Ansätze relativ einfach für mich sein.

Ich persönlich möchte jeweils nur in einem einzigen Geschäft suchen. Wenn ich mehrere Filialkoordinatoren habe, geht das automatisch. Wenn ich nur einen einzigen Filialkoordinator habe, muss ich sicherstellen, dass die Abrufanforderung eingeschränkt wird. (so oder so, keine große Sache).

In der Dokumentation zum Store Coordinator wird angedeutet, dass sein Vorteil darin besteht, dass er mehrere Läden als einen einzigen erscheinen lässt. Für meine Anwendung brauche oder will ich das nicht, also ist das für mich nicht wirklich eine Überlegung (obwohl, wenn ich in Zukunft storeübergreifende Suchfunktionen hinzufügen wollte, wäre es am besten, alles in einem einzigen Store Coordinator zu halten).

Für mich ist keiner der oben genannten Gründe ein wirklich gutes Argument, und wenn sie die einzigen Argumente wären, würde ich wahrscheinlich versuchen, die Dinge auf die konventionelle Art und Weise zu erledigen und bei einem einzigen Koordinator zu bleiben.

Ein letzter Grund (und der Hauptgrund, warum ich diese Frage ursprünglich gestellt habe) ist jedoch, dass ich plane, einige Funktionen in iOS 5 zu nutzen, die anscheinend mehrere Store Coordinators erfordern. Ich möchte in der Lage sein, weak-link meine App abwärtskompatibel zu sein, so scheint es, dass mit meinem iOS 4 Code eng ähneln die iOS 5 Code wäre vorzuziehen.

Je mehr ich darüber nachdenke, mit der Unterstützung für mehrere Betriebssystemversionen, könnte ich wahrscheinlich immer noch die Dinge so oder so mit den richtigen Abstraktionen implementieren.

Ich danke Ihnen allen für Ihr Feedback! Langsam bekomme ich den Dreh mit Core Data raus, was größtenteils eine großartige Erfahrung war, obwohl es mir auch Kopfschmerzen bereitet hat!

2voto

Neethu Punkte 31

Im Allgemeinen wird eine App nur einen PersistentStoreCoordinator verwenden und dieser wird im App-Delegate initialisiert.

Weitere Einzelheiten und Erläuterungen finden Sie in den Dokumenten für Äpfel auf Kerndaten

2voto

Rog Punkte 18402

Ich kann mir ehrlich gesagt keinen Grund vorstellen, warum Sie einen zweiten Koordinator benötigen, es sei denn, Sie führen auf demselben Modell einige ernsthafte gleichzeitige Aufgaben mit mehreren Threads aus. Ausgehend von dem, was Sie oben beschrieben haben, müssen Sie möglicherweise nur einen separaten Kontext für bestimmte verwaltete Objekte oder möglicherweise separate Speicher erstellen, wenn Sie sie völlig unabhängig sein müssen.

Sie werden kaum jemals direkt mit einem persistenten Speicherkoordinator interagieren, da die meisten Ihrer Operationen auf Kontextebene durchgeführt werden und dann, wenn Sie bereit sind (wiederum über den Kontext), durch den Speicherkoordinator persistiert werden.

Sie haben offensichtlich Ihre eigene Forschung getan, so dass ich nicht gehen, um Ihnen zu sagen, um Dokumentation XYZ zu überprüfen (Core Data ist gut für grundlegende Ebene Zeug dokumentiert, aber alles etwas fortgeschrittener und Sie sind auf eigene Faust), aber mein Hauptpunkt ist, dass mit einem separaten Store Coordinator für jedes dieser Modelle wird wahrscheinlich die Komplexität Ihres Codes erhöhen, anstatt es einfacher zu verwalten, die Ihre Hauptmotivation in der ursprünglichen Frage zu sein scheint.

1voto

Paul Tiarks Punkte 1863

Ich sehe keine wirkliche technische Einschränkung, wenn Sie mehrere NSPersistentStoreCoordinator-Instanzen in Ihrer Anwendung haben, solange sie alle auf einen eindeutigen Speicherort auf der Festplatte zeigen.

Dieser Ansatz ist jedoch definitiv nicht üblich und wird Ihrer Anwendung eine Menge Komplexität hinzufügen, die möglicherweise nicht notwendig ist. Ausgehend von dem, was Sie über Ihr Datenmodell beschrieben haben, sehe ich keinen Grund, warum Sie mehrere NSPersistentStoreCoordinators benötigen würden.

Lesen Sie unbedingt das CoreData-Programmierhandbuch und beachten Sie, dass Sie einen eindeutigen NSManagedObjectContext pro Thread erstellen müssen und nicht pro NSPersistentStoreCoordinator, wie Sie in Ihrer Frage beschrieben haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X