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.
Führen Sie eine 'mergeChangesFromContextDidSaveNotification:' durch, wenn der Kindkontext die 'NSManagedObjectContextDidSaveNotification' Benachrichtigung speichert und veröffentlicht? – dtrotzjr
@ dtrotzjr: Ja, bin ich. – Isaac
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. –