2 Stimmen

POSTing eines ManagedObjects über RestKit führt zu "Cannot update object that was never inserted"

Ich erstelle ein verwaltetes Objekt, speichere den Kontext und poste wie folgt:

 [[RKObjectManager sharedManager] postObject:tag mapResponseWith:tagMappingForPOST delegate:tagLoader];

En tagLoader erhält das Objekt zurück, kann es aber nicht im Kontext des RestKit speichern:

Failed to save managed object context after mapping completed: The operation couldn’t be completed. (Cocoa error 134030.)

NSUnderlyingException=Cannot update object that was never inserted.

Ich mache das Gleiche mit demselben Backend-Server (Parse.com) mit derselben Klasse und es funktioniert einwandfrei. Irgendwelche Hinweise auf die möglichen Gründe, warum die Fehlermeldung "Cannot update object that was never inserted.

3voto

Jinyoung Kim Punkte 2171

Es stellt sich also heraus, dass RestKit erwartet, dass der Kontext gespeichert wird vor Senden der postObject:mapResponseWith:delegate Nachricht an RKObjectManager . Mein Problem war, dass ich den Kontext direkt nach der postObject:mapResponseWith:delegate Nachricht (die ich dachte, war ok, weil dies immer noch sein würde, bevor der Lader jemals eine Antwort zurück von der Webservice bekam. Ich tat etwas wie so:

NSManagedObject *myObj = [NSEntityDescription insertNewObjectForEntityForName:@"MyObjects" inManagedObjectContext:context];
[[RKObjectManager sharedManager] postObject:myObj mapResponseWith:objMappingForPOST delegate:myObjLoader];
[context save:&error];

... dann die myObjLoader eine Antwort zurückerhält und versucht, die Eigenschaften in myObj (createdAt, parse's objectId, etc.) und werfen einen Fehler, dass myObj nicht existiert.

Ich sollte wirklich durch den RestKit-Code lesen, um zu bestätigen, aber ich bin ziemlich sicher, was passiert ist, dass RKObjectManager erstellt den Hintergrund-Thread und den Kontext aus dem verwalteten Objektspeicher zu dem Zeitpunkt, zu dem die postObject:mapResponseWith:delegate Nachricht empfangen wird und nie mit eventuellen Zusammenführungen aktualisiert wird, bevor die Antwort zurückkommt. Um ehrlich zu sein, habe ich erwartet, dass der Kontext erstellt wird, sobald die Antwort eingegangen ist.

Es ist also sinnvoll, den Kontext zu speichern, bevor man die postObject:mapResponseWith:delegate Nachricht, etwa so:

NSManagedObject *myObj = [NSEntityDescription insertNewObjectForEntityForName:@"MyObjects" inManagedObjectContext:context];
[context save:&error];
[[RKObjectManager sharedManager] postObject:myObj mapResponseWith:objMappingForPOST delegate:myObjLoader];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X