2012-09-19 4 views
9

Mein Verständnis von der Dokumentation und von this answer das ist, wenn die Daten vorhanden ist, NSManagedObjectContext des existingObjectWithID:error: und objectWithID: Methoden sollen das gleiche Objekt zurück, aber wenn die Daten doesn‘ t existieren, existingObjectWithID:error: wird nil zurückgeben, während objectWithID: ein Objekt zurückgibt, das Fehler anstelle von Daten hat. In einer Anwendung sehe ich eine Instanz, in der (nach dem Erstellen des Objekts auf einem Hintergrundthread innerhalb eines untergeordneten verwalteten Objektkontexts und Speichern, dann zum Hauptthread gehen, Speichern und Holen der Objekt-ID von der Kindkontext zum übergeordneten Objektkontext), existingObjectWithID:error: gibt nil zurück, aber objectWithID: gibt ein tatsächlich verwendbares Objekt mit gültigen Daten zurück, keine Fehler.existingObjectWithID: Fehler: gibt nil zurück, aber objectWithID: gibt ein tatsächlich nutzbares Objekt

Ist mein Verständnis der beiden Methoden falsch? Mache ich etwas falsch?

(Ich will die RÜCKKEHR, nil -wenn-wurde leider-no-Daten Verhalten von existingObjectWithID:error:, sondern die Unfähigkeit, die Daten für neu erstellte Objekte problematisch zu erhalten.)


bearbeiten: Ich nehme an, ich könnte objectWithID: verwenden, dann testen sofort Zugriff auf eine Eigenschaft des zurückgegebenen Objekts in einem try-catch-Block, fangen die geworfene Ausnahme und ersetzen das gefälschte Objekt mit nil (as is done here), aber try-catch ist teuer in Objective -C und das scheint wirklich schlechte Idee.

+0

Führen Sie eine 'mergeChangesFromContextDidSaveNotification:' durch, wenn der Kindkontext die 'NSManagedObjectContextDidSaveNotification' Benachrichtigung speichert und veröffentlicht? – dtrotzjr

+0

@ dtrotzjr: Ja, bin ich. – Isaac

+0

Können Sie bitte Ihren Code zeigen? Es gibt so viele Dinge, die man falsch machen kann. Ohne Ihren eigentlichen Code zu sehen, ist dies ein Ratespiel. Eine Möglichkeit ist, dass Sie mit performBlock speichern: und dass Sie die Objekt-ID im übergeordneten Kontext verwenden, bevor der performBlock: ausgeführt wurde. Deine Idee mit try catch ist schlecht. Versuche es nicht. Löse das zugrunde liegende Problem, anstatt das Symptom mit try catch zu beheben. –

Antwort

1

Das Problem könnte temporäre Objekt-IDs sein. Die Objekt-ID ist nicht dauerhaft, bis sie im Geschäft gespeichert wird. Die Frage ist also, wann Sie die Objekt-ID von einem verwalteten Objekt im Kind-Kontext erhalten: bevor Sie das Eltern-Objekt oder danach speichern.

Wenn Sie dies tun, bevor Sie das übergeordnete Element speichern (was wiederum, wenn Eltern mit persistenten Speicherkoordinator und nicht mit einem anderen übergeordneten konfiguriert ist, führt zum Speichern im Speicher), dann erhalten Sie wahrscheinlich temporäre Objekt-ID. Und aus einigen Gründen, die uns von Apple nicht offenbart werden, funktioniert eine der Methoden, die verwaltete Objekte von der Objekt-ID zurückgeben, aber die andere nicht.

Verwandte Themen