1

Ich habe 2 NSManagedObject-Kontexte, einen temporären und einen anderen, der primär ist. Für den temporären Kontext ist der übergeordnete Kontext auf den primären Kontext festgelegt. Ich benutze sie beide in den folgenden Fällen:NSManagedObjectContext Child/Parent - Child entfernt registrierte Objekte nicht

  • Wenn ich ein "neues" Objekt erstellen, erstelle ich ein neues mit dem temporären Kontext. Wenn der Benutzer auf "Abbrechen" klickt und sich entscheidet, das neue Objekt nicht zu erstellen, lösche ich einfach das Objekt aus dem Kontext des verwalteten Objekts und speichere diesen Kontext.
  • Wenn der Benutzer dieses neue Objekt speichert, speichere ich den temporären Kontext und speichere dann den primären Kontext, um diese Änderungen zu erhalten. Ich benutze die "performBlock" -Methoden und verknüpfe die Saves, wie es von Apple und anderen Stackoverflow-Posts empfohlen wird.
  • Wenn ich ein vorhandenes Objekt bearbeite, behalte ich es während der Bearbeitung im primären Kontext. Wenn der Benutzer auf "Abbrechen" klickt, rufe ich "Rollback" für den primären Kontext auf, der alle Änderungen verwirft.

In diesen Fällen scheint alles gut zu funktionieren. Nach den Sicherungen meldet der temporäre Kontext, dass er 0 registrierte Objekte hat und der primäre Kontext ein zusätzliches Objekt hat.

Es gibt jedoch einen Fall, in dem das Erstellen eines "neuen" Objekts ein anderes Objekt enthält, das eine Beziehung zu diesem neuen Objekt hat. Für dieses Objekt erstelle ich also das neue Objekt, erstelle das "Kind" -Objekt und setze es auf das Elternobjekt. Also gibt es 2 NSManagedObjects. Ich führe einen "Save" auf die gleiche Weise durch - der temporäre Kontext wird gespeichert und anschließend wird der primäre gespeichert. Das Problem ist, dass mein temporärer Kontext immer noch angibt, dass er nach dem Speichern 2 registrierte Objekte hat. Das primäre Objekt gibt auch an, dass es 2 hat, und sie werden alle korrekt angezeigt.

Ich kann dies beheben, indem Sie einen "Reset" für den temporären Kontext nach dem Ausführen der "Speichern" im temporären Kontext durchführen. Dies scheint jedoch nicht richtig zu sein. Warum sollte ich das tun müssen? Warum meldet mein temporärer Kontext registrierte Objekte auch nach dem Speichern noch?

EDIT: Ich kann auch beheben, indem Sie "refreshObject: Objekt mergeChanges: NO" auf das Objekt aus dem temporären Kontext nach dem Speichern im temporären Kontext durchführen. Dies scheint die beste Lösung für jetzt (bis jemand erklären kann, warum ich das tun muss oder warum das passiert). Meine Vermutung ist, dass die Objekte sich aufeinander beziehen, was dazu führt, dass die Objekte nicht freigegeben werden.

Antwort

0

Wenn Sie den Speichervorgang auf MOC ausführen, wird das Objekt im übergeordneten MOC des persistenten Speichers gespeichert. Das Objekt wird jedoch weiterhin von MOC im Speicher gehalten.

Standardmäßig sind die Referenzen zwischen einem verwalteten Objekt und seinem Kontext schwach. Die Ausnahme von dieser Regel besteht darin, dass ein Kontext für verwaltete Objekte einen starken Verweis auf geänderte (eingefügte, gelöschte und aktualisierte) Objekte behält, bis die ausstehende Transaktion festgeschrieben (mit einem Speichervorgang) oder verworfen (zurückgesetzt oder zurückgesetzt) ​​wird.

Wenn Sie der Meinung sind, dass dieses Objekt nicht mehr für die aktuelle Zukunft benötigt wird oder Alarme (in einem Speicher) generiert werden, möchten Sie das Diagrammobjekt trimmen, indem Sie jedes Objekt mit "refreshObject" in einen Fehler verwandeln : Objekt mergeChanges: NO "

+0

Es scheint, dass die Ausführung eines "refreshObject" oder "refreshAllObjects" keine nachteiligen Nebenwirkungen für meine Anwendung verursacht. Sobald das "Speichern" im primären Kontext auftritt, wird mein abgerufener Ergebniscontroller über die Änderung erfolgreich informiert (mit oder ohne den temporären Kontext zu löschen). Es scheint, dass die Aktualisierung die beste Option ist. – CoBrA2168

+0

Das Aktualisieren von Objekten führt dazu, dass Core-Daten je nach Ihrem Stalyness-Intervall erneut in den Store gelangen. Es gibt einen Leistungseinfluss, wenn Sie eine Aktualisierung aufrufen, und sie sollte sparsam verwendet werden. Core Data ist sehr gut darin, seinen eigenen Speicher zu verwalten. Beteiligen Sie sich nur, wenn Sie ein tatsächliches Leistungsproblem haben. –

+0

Kein echtes Leistungsproblem, nur um zu verhindern, dass es in der Zukunft auftritt. Ich begann, dies zu untersuchen und mein Core-Data-Modell zu ändern, als ich Instrumente benutzte - ich bemerkte, dass gelöschte NSManagedObjects im Speicher blieben. Ich konnte keine konkreten Beweise oder Dokumente finden, die das als erwartetes Verhalten ausweisen. – CoBrA2168

0

Warum werden Sie mit der Anzahl der registrierten Objekte berücksichtigt? Registrierte Objekte sind einfach eine Liste von Objekten, die dem Kontext bekannt sind. Da dieser Kontext diese Objekte erzeugt hat, würde er sie natürlich auch nach dem Speichern weiterhin wahrnehmen. Core Data löscht Objekte nach einem Speichervorgang nicht.

Liest mir, dass es wie vorgesehen funktioniert.

+0

Sehen Sie, ich war nicht sicher, ob dies das beabsichtigte Verhalten war oder nicht. Was es so aussehen lässt, als ob etwas falsch ist, ist, dass selbst nach dem Ausführen einer "Lösch" -Operation an den fraglichen Objekten der temporäre Kontext immer noch angibt, dass sich diese registrierten Objekte im Speicher befinden. – CoBrA2168

+0

Ja und es wird sie für eine Zeit danach registriert bleiben. Solange Sie keinen bestimmten Grund haben, auf registriertesObjekt zuzugreifen, hat es im täglichen Betrieb keinen großen Wert. Es ist irgendwie wie '-retainCount' zurück in den Tag, etwas, das nützlich klingt, aber letztlich keinen Wert für" uns "(Nicht-Apple-Entwickler) hat. –

Verwandte Themen