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

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top