2012-06-09 7 views
5

Ich verwende RestKit 0.10.1 mit Core Data auf einem iOS 5.0-Implementierungsziel, um eine App zu erstellen, die mit einer benutzerdefinierten RESTFul-API verbunden ist. Da die Offline-Verbindung wichtig ist, verwalte ich einen Cache mit den Benutzerdaten in einer lokalen CoreData-Datenbank auf dem Gerät.RestKit + CoreData: Wie kann ein Objekt lokal gespeichert werden, nachdem die Fernspeicherung erfolgreich war?

Jetzt ist RestKit ziemlich genial und es war ziemlich mühelos, einen RKFetchResultsTableController einzurichten, um meine Daten einfach anzuzeigen und persistent zu machen. Es gibt jedoch ein Verhalten von RestKit, das nicht ideal erscheint und das ich nicht herausfinden kann, wie ich es ändern kann.

Ich habe ein Modell namens "Recording". Um eine neue Aufnahme zu erstellen, ich tue das folgende:

Recording *r = [NSEntityDescription insertNewObjectForEntityForName:@"Recording" inManagedObjectContext:[[RKObjectManager sharedManager].objectStore managedObjectContextForCurrentThread]]; 

r.name = newName; 

[[RKObjectManager sharedManager] sendObject:r toResourcePath:@"/recordings" usingBlock:^(RKObjectLoader *loader){ 
     loader.delegate = self; 
     loader.method = RKRequestMethodPOST; 
     loader.serializationMIMEType = RKMIMETypeJSON; 

     loader.serializationMapping = [RKObjectMapping serializationMappingUsingBlock:^(RKObjectMapping *serializationMapping){ 
      [serializationMapping mapAttributes:@"name", nil]; 

     }]; 

     RBMappingProvider *mappings = (RBMappingProvider *)[[RKObjectManager sharedManager] mappingProvider]; 
     loader.objectMapping = [mappings recordingObjectMapping]; 

    }]; 

Dadurch entsteht eine neue Einheit vom Typ ‚Aufnahme‘ und sendet dann die Einheit an den Server in einer POST-Anfrage. In einem Erfolgsfall funktioniert das großartig.

Das Problem ist jedoch, dass der Server manchmal diese legitim ablehnt. Was ich in diesen Situationen finde, ist, dass es bereits eine lokale Kopie der Entität in der Core Data Datenbank mit einer ID von 0 gibt (die ID ist der Primärschlüssel, der vom Server gesetzt wird).

Die lokale Entität kann nur entfernt werden, indem eine Aktualisierung der lokalen Daten vom Server erzwungen wird.

Gibt es eine Möglichkeit, das Objekt lokal zu persistieren, nur wenn der Server mit einem 2xx antwortet? Gibt es alternativ eine Möglichkeit, die Änderungen rückgängig zu machen, wenn der Server mit nichts als einem 2xx antwortet?

Danke,

+0

FWIW, die Entität mit Aufnahme * r = [Aufzeichnungsobjekt] wie vorgeschrieben in dem RestKit docs Schaffung überhaupt nicht das Verhalten ändern. – apurva

+0

Haben Sie keine Rückrufmethode in RK mit der Serverantwort? Behalten Sie einen Verweis auf das Objekt und löschen Sie es, wenn der Upload abgelehnt wurde. – Mundi

+0

@mundi Das ist ein Ansatz, und es könnte sogar der wünschenswerteste sein. Ich habe mich jedoch gefragt, ob es möglich ist, den lokalen Zustand erst zu erhalten, nachdem der Server die Nutzlast akzeptiert hat. Dies würde viel weniger redundanten Code ergeben. – apurva

Antwort

0

Leider, denn die Aufzeichnung ein NSManagedObject ist, selbst braucht Ihre temporäre Instanz in den verwaltete Objektkontext eingefügt werden. @ Mundis Lösung, die Referenz beizubehalten und sie nach dem Fehler aus dem Kontext zu löschen, ist die Lösung, die ich verwenden würde. Ein bisschen zusätzlichen Code schlägt eine vollständige Aktualisierung vom Server.

Das Upgrade auf 0,20.x erleichtert dies. Die Erfolgs- und Fehlerblöcke, die beim Senden einer Anfrage verwendet werden, machen es sehr einfach, diese Referenz beizubehalten und bei einem Fehler zu löschen. Zum Beispiel:

[_objectManager postObject:aMessage 
         path:@"message" 
       parameters:parameters 
        success:^(RKObjectRequestOperation * operation, RKMappingResult * mappingResult){ 
        // Success code here 
        } 
        failure:^(RKObjectRequestOperation * operation, NSError * error){ 
        [_managedObjectContext deleteObject:aMessage]; 
        [_managedObjectContext save:nil]; 
        }]; 
Verwandte Themen