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

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top