Core Data Contexto “sujo”: MOC salvar falhas de aplicativos
-
19-09-2019 - |
Pergunta
bastante novo para iPhone dev. Meu aplicativo usa Core Data, e em um ponto que eu estou tentando salvar alguns dados durante um método NSFetchedResultsControllerDelegate:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
Eu estou recebendo a maior parte deste para fora da direita da documentação da Apple sobre o assunto. Os olhares ação de exclusão da seguinte forma:
case NSFetchedResultsChangeDelete:
[managedObjectContext deleteObject:anObject];
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"WTF? %@", [error description]);
}
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
Agora, quando eu fizer isso, o objeto em questão serão apagados após o acidente inevitável. Então a coisa certa está acontecendo. O acidente é interessante, embora:
erro de aplicação sério. Exceção foi pego durante o processamento mudança Core Data: Falha ao alterações pendentes do processo antes de salvar. O contexto ainda é sujo depois de 100 tentativas. Normalmente, isso sujar recursiva é causada por um mau método de validação, -willSave, ou manipulador de notificação. com userInfo (null)
2010-02-09 23: 02: 03,931 app2 [26664: 207] *** App terminação devido à exceção não capturada 'NSInternalInconsistencyException', razão: 'Falha ao processo pendente mudanças antes de salvar. O contexto ainda é sujo depois de 100 tentativas. Normalmente, isso sujar recursiva é causada por um mau método de validação, -willSave, ou manipulador de notificação. '
A minha pesquisa revelou alguns resultados muito limitados - coisa boa que eu tenho aqui para documentar isso, hein? :-) Mas meu intestino está dizendo que o MOC está sendo escrito para outro lugar no meu controlador, embora eu posso encontrar nenhuma evidência de que isso aconteça. O método viewDidLoad tem o NSFetchedResultsController sendo usado para obter os dados iniciais, mas é isso.
Todas as sugestões sobre o que poderia estar errado aqui? Como de costume, sua mente colméia baseada na comunidade é muito apreciado!
Cheers, Aaron
Solução
(Se eu entender o problema corretamente) Eu acho que tudo o que você precisa fazer neste caso é:
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
Lembre-se que o método
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
é notificado após os dados subjacentes mudou. Então eu acredito que o objeto já é excluído, você não precisa para excluí-lo manualmente. Tudo o que resta a ser feito neste método é removê-lo do tableView.
Espero que isso ajude!