Sto utilizzando RestKit 0.10.1 con Core Data su una destinazione di distribuzione iOS 5.0 per creare un'app che si interfaccia con un'API RESTFul personalizzata. Poiché la connettività offline è importante, sto mantenendo una cache dei dati dell'utente in un database CoreData locale sul dispositivo.RestKit + CoreData: come salvare un oggetto localmente solo dopo che il salvataggio remoto ha avuto successo?
Ora, RestKit è davvero fantastico ed è stato piuttosto semplice impostare un RKFetchResultsTableController per visualizzare e mantenere i miei dati. Tuttavia, c'è un comportamento di RestKit che non sembra ideale e che non riesco a capire come cambiare.
Ho un modello chiamato "Registrazione". Per creare una nuova registrazione, sto facendo il seguente:
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];
}];
Questo crea una nuova entità di tipo 'Recording' e poi invia il soggetto al server in una richiesta POST. In un caso di successo, funziona alla grande.
Tuttavia, il problema è che il server a volte respinge questi crea legittimamente. Quello che trovo in queste situazioni è che esiste già una copia locale dell'entità nel database Core Data con un id di 0 (l'id è la chiave primaria che è impostata dal server).
L'unico modo per rimuovere l'entità locale è forzare un aggiornamento dei dati locali dal server.
C'è un modo per mantenere l'oggetto localmente solo quando il server risponde con un 2xx? In alternativa, c'è un modo per annullare le modifiche se il server risponde con qualcosa tranne un 2xx?
Grazie,
FWIW, creando l'entità con registrazione * r = [oggetto registrazione] come prescritto nella documentazione RestKit non modifica il comportamento affatto. – apurva
Non hai un metodo di callback in RK con la risposta del server? Mantieni un riferimento all'oggetto ed eliminalo se il caricamento è stato rifiutato. – Mundi
@mundi Questo è un approccio, e potrebbe anche essere il più desiderabile. Tuttavia, mi chiedevo se fosse possibile mantenere lo stato locale solo dopo che il server ha accettato il payload. Ciò comporterebbe un codice ridondante molto meno. – apurva