2013-02-04 9 views
17

Wie wird der Kontext für untergeordnete verwaltete Objekte aktualisiert, sodass dieselben Daten mit den übergeordneten Daten übereinstimmen?Ist der Inhalt des untergeordneten Objekts für verwaltete Objekte immer identisch mit dem Inhalt des übergeordneten Objekts?

Soweit ich weiß, geht das Kind beim Speichern nur einen Schritt, nämlich an die Eltern. Doch wenn das Holen immer sehr tief geht, bis zum Elternteil und dem persistenten Speicher. Ich erwarte also, dass alles gleich bleibt.

Noch ist es nicht.

Ich habe einen verwalteten Objektkontext, der übergeordnete Elemente aller anderen verwalteten Objektkontexte ist.

Ein Kind Daten ändern und speichern. Der Elternteil wird ebenfalls geändert. Ich executeFetchRequest auf Eltern und ich sehe, dass die Daten ändern.

Allerdings verwenden einige Kinder der Eltern immer noch alte Daten. Gleiche Objekt ID gleiche Daten. Irgendwie bleibt der Wert der Immobilie gleich.

Wie kann ich dem Kind sagen, dass es frische Daten von den Eltern laden soll?

Um genauer

Say P die Mutter sagen sein

es C1 C2 C3 als untergeordnete Daten

Dann C1 ändert und begehen hat. Die Änderung wird an P weitergegeben. Die Ausführung von executeFetchRequest an C2 und C3 zeigt jedoch immer noch alte Daten an.

Was gibt?

Zum Beispiel, wenn ich für die imageBlob Eigenschaft zu überprüfen, ist es das, was ich bekommen:

Kind:

2013-02-05 13:57:42.865 BadgerNew[78801:c07] imageBlob: <UIImage: 0x89c3c50> 
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null> 
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null> 
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null> 

Parent:

2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114af650> 
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x8e492e0> 
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114c79b0> 
2013-02-05 13:57:42.869 BadgerNew[78801:c07] imageBlob: <UIImage: 0xa8c76e0> 

Hier ist eine umfassendere Version, warum Ich notiere den Moc, den Eltern-Moc, den Blob, die URL und die Objekt-ID. Kind:

Insbesondere möchte ich die Mainqueue managedobject Kontext ein anderes Kind des Elternteils und nicht der Eltern aller anderen ManagedObjectContext sein. Auf der anderen Seite möchte ich auch, dass der mainQueue-Objektkontext über aktuelle Informationen verfügt. Ich frage mich, was die Standardlösung sein soll.

+3

Wow, ich habe 50 Bounties und habe 5 Stimmen, also habe ich 10 Punkte zurück :) –

Antwort

21

Das Kind hat ungültige vorhandene Referenzen. Wenn die Geschwister nach dem Speichern der übergeordneten Elemente synchronisiert werden sollen, müssen Sie die untergeordneten Elemente mit reset ungültig machen.

Nach dem Aufruf reset sind alle verwalteten Objekte des Empfängers "vergessen". Wenn Sie diese Methode verwenden, sollten Sie Verweise auf verwaltete Objekte verwerfen, die mit dem Empfänger abgerufen wurden, da sie danach ungültig sind.

Sie können auch für die einzelnen Objekte verwenden, die beim Speichern des übergeordneten Kontexts in allen untergeordneten Kontexten geändert wurden, wenn Sie geänderte Objekte in den untergeordneten Kontexten feiner steuern möchten.

+0

Während es wahr ist mit Reset ist Art von Overkill. Ich finde eine andere Lösung. –

+0

Ich habe die Methode hinzugefügt, um einzelne Managed Objects im Kontext zu aktualisieren. –

+0

Bravo :) Ich habe das tatsächlich benutzt. Genieße die Bounty :) Und weiß jemand, warum die Frage abgelehnt wird? –

0

Es gibt tatsächlich eine Menge Dokumentation darüber, wie man das richtig macht, einschließlich WWDC Session Videos von 2011 und 2012. 2012 Session 214 "Core Data Best Practices" wäre besonders interessant für Sie.

Zum Beispiel für Ihre speichern, sollte es wie folgt aussehen:

[child performBlock:^{ 
    [child save:&error]; 
    [parent performBlock:^{ 
     [parent save:&parentError]; 
    }]; 
}]; 

, dass das Kind rettet, gehen die Änderungen an der übergeordneten und Sie auf dem übergeordneten speichern - was richtig all diese Änderungen propagieren würde andere Kindkontexte. Wenn Sie sich Ihre Frage ansehen, werden Sie möglicherweise auf andere Probleme mit Ihrer Implementierung stoßen, und die Sitzung 214 kann sehr hilfreich sein, um sie zu lösen.

Wie zum Zurücksetzen des Kontexts, würde ich nicht empfehlen, dies zu tun, wenn Eltern Kind Kontexte verwenden. Ich würde auch davon ablenken, refreshObject:mergeChanges: zu verwenden. Die Verwendung von objectWithID zu diesem Zweck kann Ihnen eine Menge Schmerzen ersparen, da der Zeilencache des verwalteten Objekts optimal genutzt wird. Es wird auch nur so weit gehen, wie es durch den Stapel von Kindern und Eltern benötigt wird, um die Anfrage zu erfüllen.

+0

Das ist GENAU das Problem. Ich dachte, ändere das Elternteil, ändere das ganze Kind. NEIN. Wie Fruity Geek sagte, ist die Kerndatenpraxis für das erneute Laden von Daten von Eltern wackelig. Was Kerndaten tun, ist, existierende Daten auf dem Kind zu verwenden, falls es existiert. Nur wenn es nicht existiert oder veraltete Kerndaten, würde es tiefer gehen. –

+1

+1 für zeigen, dass ich [Eltern performBlock] in [Kind performBlock] –

+0

anrufen sollte Aber Fruity Geek Antwort ist richtiger. Ich werde ihn wählen, wenn es keine bessere Antwort mehr gibt, an die ich nicht denken kann. –

Verwandte Themen