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,
FWIW, die Entität mit Aufnahme * r = [Aufzeichnungsobjekt] wie vorgeschrieben in dem RestKit docs Schaffung überhaupt nicht das Verhalten ändern. – apurva
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
@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