0

J'ai une classe de contrôleur TableView qui utilise un contrôleur de résultats récupérés pour afficher une liste d'entités «patient» provenant d'un modèle de données de base. Les sections de cette table proviennent d'un attribut patient appelé "emplacement". Voici le descripteur de tri pour la requête d'extraction:Erreur d'application grave

NSSortDescriptor *locationDescriptor = [[NSSortDescriptor alloc] initWithKey:@"location" ascending:YES]; 
NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:locationDescriptor, lastNameDescriptor, nil]; 

Voici le code d'initialisation du FRC:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"location" cacheName:@"List"]; 

Quand je veux ajouter une nouvelle entité « patient » - je clique sur un bouton Ajouter qui pousse ensuite un contrôleur de vue «ajouter un nouveau patient» à la pile de navigation.

Le premier patient que j'ajoute fonctionne correctement.

Si j'ajoute un deuxième patient - l'application va parfois tomber en panne avec l'erreur suivante:

2010-03-22 14:42:05.270 Patients[1126:207] Serious application error. Exception was caught during Core Data change processing: * -[NSCFArray insertObject:atIndex:]: index (1) beyond bounds (1) with userInfo (null) 2010-03-22 14:42:05.272 Patients[1126:207] * Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray insertObject:atIndex:]: index (1) beyond bounds (1)'

Cela ne semble se produire si le patient ont un emplacement ajouté (si aucun ajout n'a été alors l'emplacement par défaut à 'inconnu'). Cela semble avoir quelque chose à voir avec le tri de l'emplacement aussi. Par exemple, si l'emplacement du premier patient = quartier 14 et le second = quartier 9 alors il se bloque sans faute.

Je me demande si cela a quelque chose à voir avec la façon dont je demande au contrôleur de résultats récupérés de trier les noms des sections?

Ce bug me rend fou et je n'arrive pas à comprendre. Toute aide serait grandement appréciée!

Répondre

3

Cela semble être un bug dans le code d'Apple. J'ai eu un certain succès en utilisant this SafeFetchedResultsController sous-classe.

+0

Cela a résolu mon problème! –

+0

Est-ce encore nécessaire dans iOS 8? – SAHM

1

Chaque fois que vous voyez le message «Exception a été interceptée lors du traitement de la modification des données de base» lors de l'utilisation de NSFetchedResultsController, vous devez immédiatement commencer à examiner vos méthodes NSFetchedResultsControllerDelegate. Je recommande de définir un point d'arrêt au début du contrôleur: didChangeObject: atIndexPath: forChangeType: méthode newIndexPath. Ensuite, parcourez cette méthode et observez l'endroit où l'accident se produit. Le problème peut être que vous ne gérez pas correctement l'insertion et la suppression de section dans cette méthode.