Creo que entiendo el mensaje de error: CoreData no pudo cumplir un error, pero no estoy seguro de cómo debo tratarlo.CoreData no pudo cumplir un error para cuando los objetos se actualizan mediante el servicio HTTP
Tenemos una aplicación donde utilizamos datos básicos para conservar los datos devueltos por un servicio JSON. Hoy estoy haciendo lo siguiente.
- Fetch objeto local de almacenamiento persistente y volver a la interfaz de usuario
- Pregunta servidor si el objeto se actualiza - cuando llegue la respuesta, puedo actualizar los datos básicos objeto gestionado
- actualización de la interfaz de usuario con el objeto actualizado
El problema es; incluso si no utilizo varios subprocesos, a veces aparece un error cuando la solicitud HTTP elimina los objetos gestionados que mi interfaz de usuario ha conservado. Intenté buscar los objetos con returnsObjectsAsFaults en NO. Pensé que podría acceder a todas las relaciones y propiedades de un objeto administrado incluso si se eliminara (siempre que mi interfaz de usuario lo hubiera retenido).
¿Cómo debo resolver este problema?
Pensé que podría usar NSManagedObjectContext por separado para leer y escribir. He hecho esta prueba:
MyAuthorMO *authorUpdate = [[MyAuthorMO alloc] init]; // I have made this init insert the object into the updateContext
authorUpdate.firstname = @"Hans";
authorUpdate.lastname = @"Wittenberg";
authorUpdate.email = @"[email protected]";
NSManagedObjectContext *updateContext = [[MyCoreManager getInstance] managedObjectContext];
NSError *error = nil;
[updateContext save:&error];
NSManagedObjectContext *readContext = [[MyCoreManager getInstance] readOnlyContext];
NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:@"authorByEmail" substitutionVariables:[NSDictionary dictionaryWithObject:@"[email protected]" forKey:@"EMAIL"]];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSArray *authors = [readContext executeFetchRequest:fetchRequest error:&error];
MyAuthorMO * readAuthor = [authors objectAtIndex:0];
// Delete the author with update context:
[updateContext deleteObject:authorUpdate];
[updateContext save:&error];
NSLog(@"Author: %@ %@, (%@)", readAuthor.firstname, readAuthor.lastname, readAuthor.email);
El registro se emite muy bien, siempre y cuando utilizo el readContext para la obtención de información. Si uso el updateContext para la búsqueda, obtengo una excepción. Esto parece prometedor, pero me temo que tendré problemas en una etapa posterior. Tarde o temprano, probablemente intente acceder a una propiedad que no se recupera por completo (un error). ¿Cómo puedo lograr el comportamiento que estoy buscando?
Nick, probablemente tengas razón. He leído mis publicaciones anteriores y acepto las mejores soluciones. Gracias por tu comentario. – Andi