3

J'ai un seul document géré dans mon application complète (avec deux entités) que l'utilisateur peut mettre à jour à partir de deux contrôleurs de vue différents. Chaque contrôleur de vue possède sa propre propriété NSFetchedResultsController pour relayer les modifications apportées à: un UICollectionView dans un contrôleur de vue et un UITableView dans l'autre. L'UICollectionView dans le contrôleur de la vue racine affiche les équipes, tandis que l'UITableView dans le contrôleur de vue séparée affiche les joueurs de cette équipe. Lorsque je suis dans le premier contrôleur de vue, je peux ajouter des instances d'une équipe et cela fonctionne correctement car il les enregistre dans le document, puis les ajoute à UICollectionView. Quand je suis dans le deuxième contrôleur de vue, je fais une insertion du joueur dans CoreData et appel:CoreData Saving Issue

[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting  completionHandler:nil]; 

Cela appelle correctement la méthode NSFetchedResultsControllerDelegate: - (void) contrôleur: didChangeObject: atIndexPath: forChangeType: newIndexPath:

Dans cette méthode déléguée, je l'appelle:

[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 

Cependant, appelant cette méthode d'insertion de la ligne sur l'affichage du tableau provoque l'erreur suivante de base de données:

"CoreData: erreur: Erreur d'application grave. Une exception a été détectée pendant le traitement de la modification des données de base. C'est généralement un bug dans un observateur de NSManagedObjectContextObjectsDidChangeNotification. * - [__ NSPlaceholderArray initWithObjects: compte:]: tentative d'insérer objet nul à partir d'objets [0] avec userInfo (null) »

Mon fetchedResultsController est certainement un observateur de NSManagedObjectContextObjectsDidChangeNotification, mais cette erreur se produit avant toute modification Donc, je suis fondamentalement incapable de déterminer à quel point le contexte d'objet géré obtient null userInfo

(Une autre chose qui se passe est que mon NSFetchedResultsController du contrôleur de vue racine, qui a le UICollectionView, déclenche son Déléguez la méthode juste avant que NSFetchedResultsController dans le contrôleur de vue suivant, qui a l'UITableView, déclenche le sien. fonctionnalité rrect, car l'équipe et le lecteur reçoivent des mises à jour dans CoreData).

Des réflexions sur les raisons pour lesquelles l'insertion de ligne UITableView est à l'origine de cette erreur ou sur la façon dont mon document géré unique pourrait présenter des incohérences pouvant provoquer cette erreur?

Répondre

7

Dans le cas d'un événement NSFetchedResultsChangeInsert, indexPath est nil et newIndexPath est le chemin de destination de l'objet inséré. Par conséquent, vous devez appeler

[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] 
         withRowAnimation:UITableViewRowAnimationAutomatic]; 

pour un événement de mise à jour.

+1

Wow, erreur stupide. Super endroit cependant, avec le code limité que j'ai fourni. Merci! – user1096786

+0

J'ai compris, merci. – user1096786

0

NSManagedContext ne doit être sauvegardé qu'en utilisant 'save: error:' - pourquoi faites-vous le 'document save' comme indiqué?