Penso di aver compreso il messaggio di errore: CoreData non è riuscito a soddisfare un errore, ma non sono sicuro di come dovrei gestirlo.CoreData non è riuscito a soddisfare un errore quando gli oggetti vengono aggiornati dal servizio HTTP
Abbiamo un'applicazione in cui utilizziamo Core Data per mantenere i dati restituiti da un servizio JSON. Oggi sto facendo il seguente.
- Fetch oggetto locale da archivio permanente e tornare alla UI
- Chiedi server se l'oggetto viene aggiornato - quando ho la risposta, aggiornare i dati Nucleo gestito oggetto
- Aggiornamento UI con l'oggetto aggiornato
Il problema è; anche se non utilizzo thread multipli, a volte viene visualizzato un errore quando la richiesta HTTP elimina gli oggetti gestiti che la mia UI ha conservato. Ho provato a recuperare gli oggetti con returnObjectsAsFaults su NO. Ho pensato quindi di poter accedere a tutte le relazioni e le proprietà di un oggetto gestito anche se è stato cancellato (purché l'interfaccia utente l'abbia conservato).
Come si può risolvere questo problema?
Ho pensato di poter utilizzare NSManagedObjectContext separato per leggere e scrivere. Ho fatto questo test:
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);
Il registro viene emesso bene finché io uso il readContext per il recupero. Se utilizzo l'updateContext per il recupero, ottengo un'eccezione. Questo sembra promettente, ma temo di incappare in problemi in una fase successiva. Presto o tardi tenterò probabilmente di accedere a una proprietà che non è stata recuperata completamente (un errore). Come posso ottenere il comportamento che sto cercando?
Nick, probabilmente hai ragione. Ho letto i miei post precedenti e ho accettato le migliori soluzioni. Grazie per il tuo commento. – Andi