Nucleo Contesto dati “sporco”: MOC Salva blocca app
-
19-09-2019 - |
Domanda
abbastanza nuovo per iPhone dev. La mia app utilizza Core Data, ea un certo punto io sto tentando di salvare alcuni dati durante un metodo NSFetchedResultsControllerDelegate:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
Mi sto maggior parte di questa destra, fuori la documentazione di Apple sull'argomento. L'azione di eliminazione si presenta in questo modo:
case NSFetchedResultsChangeDelete:
[managedObjectContext deleteObject:anObject];
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"WTF? %@", [error description]);
}
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
Ora, quando faccio questo, l'oggetto in questione sarà cancellato dopo l'incidente inevitabile. Quindi, qualcosa di giusto sta accadendo. L'incidente è interessante, anche se:
Grave errore di applicazione. Eccezione è stato catturato durante la lavorazione cambiamento Core Data: Impossibile elaborare modifiche in sospeso prima di salvare. Il contesto è ancora sporco dopo 100 tentativi. In genere questo sporcamento ricorsiva è causato da un cattivo metodo di validazione, -willSave o gestore di notifica. con userInfo (null)
2010-02-09 23: 02: 03,931 app2 [26664: 207] *** terminazione app a causa di eccezione non identificata 'NSInternalInconsistencyException', la ragione: 'Impossibile elaborare modifiche in sospeso prima di salvare. Il contesto è ancora sporco dopo 100 tentativi. In genere questo sporcamento ricorsiva è causato da un cattivo metodo di validazione, -willSave o gestore di notifica '.
La mia ricerca si è alzato alcuni risultati molto limitati - buona cosa ho qui per documentare questo, eh? :-) Ma il mio intestino sta dicendo che la MOC vengono scritti altrove in mio controller, anche se riesco a trovare alcuna prova che questo accada. Il metodo viewDidLoad ha il NSFetchedResultsController utilizzato per ottenere i dati iniziali, ma questo è tutto.
Qualche suggerimento su quello che potrebbe essere sbagliato qui? Come al solito, la mente alveare su base comunitaria è molto apprezzato!
Saluti, Aaron
Soluzione
(Se ho capito il problema in modo corretto) Credo che tutto quello che devi fare in questo caso è:
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
Ricordate che il metodo
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
è notificato dopo che i dati di fondo è cambiato. Quindi credo che l'oggetto è già stato eliminato, non è necessario eliminare manualmente. Tutto ciò che rimane da fare in questo metodo è rimuoverla dal tableView.
Spero che questo aiuti!