existingObjectWithID: Fehler: gibt nil zurück, aber objectWithID: gibt ein tatsächlich verwendbares Objekt zurück

9

Mein Verständnis aus der Dokumentation und aus dieser Antwort besteht darin, dass, wenn die Daten vorhanden sind, existingObjectWithID:error: und% co_de von NSManagedObjectContext % Methoden sollten das gleiche Objekt zurückgeben, aber wenn die Daten nicht existieren, gibt objectWithID: existingObjectWithID:error: zurück, während nil ein Objekt zurückgibt, das Fehler anstelle von Daten hat.

Was ich in einer Anwendung sehe, ist eine Instanz, in der (nach dem Erstellen des Objekts in einem Hintergrund-Thread innerhalb eines Kind-verwalteten Objektkontextes und Speichern, dann zum Haupt-Thread, Speichern und Holen der Objekt-ID vom Kind Kontext zum übergeordneten Objektkontext), objectWithID: gibt existingObjectWithID:error: zurück, aber nil gibt ein tatsächlich verwendbares Objekt mit gültigen Daten zurück, keine Fehler.

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

(Ich möchte das Verhalten returns objectWithID: -when-there's-no-data von nil , aber die Unfähigkeit, die Daten für neu erstellte Objekte abzurufen, ist problematisch.)

edit Ich könnte vermutlich existingObjectWithID:error: verwenden, dann sofort den Zugriff auf eine Eigenschaft des zurückgegebenen Objekts in einem try-catch-Block testen und die ausgelöste Ausnahme abfangen. und Ersetzen des gefälschten Objekts durch objectWithID: ( wie hier ), Aber Versuch-Fang ist in Objective-C teuer und das scheint eine wirklich schlechte Idee zu sein.

    
Isaac 19.09.2012, 22:02
quelle

1 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 untergeordneten Kontext erhalten: bevor Sie das übergeordnete Element oder danach speichern.

Wenn Sie dies tun, bevor Sie das übergeordnete Element speichern (was wiederum dazu führt, dass, wenn das übergeordnete Element mit einem permanenten Speicherkoordinator und nicht mit einem anderen übergeordneten Element konfiguriert ist, das Speichern im Speicher erfolgt), erhalten Sie wahrscheinlich eine 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.

    
eofster 20.12.2013 11:44
quelle