0

Cela m'a rendu fou toute la journée. J'ai un bug étrange que je pense avoir réduit à un NSPredicate. J'ai deux entités: Liste et Personne. La liste a une relation "to-many" avec les personnes appelées "Person" et "Person" avec une relation "to-many" aux listes "List".Relations de données de base, NSPredicates et NSFetchedResultsController

Je passe à mon un contrôleur TableView un objet List. Je veux ensuite que le contrôleur de table affiche les Personnes qui appartiennent à cet objet de liste. Je fais cela avec un NSFetchedResultsController.

Lors de la configuration de NSFRC, j'ai le code suivant (gestion de la mémoire omise pour plus de clarté). La liste en question est myList:

// Create the request and set it's entity 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

// Create a predicate to get the persons that belong to this list 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lists == %@)", myList]; 

// Assign this predicate to the fetch request 
[fetchRequest setPredicate:predicate]; 

// Define some descriptors 
NSSortDescriptor *locationDescriptor = [[NSSortDescriptor alloc] initWithKey:@"location" ascending:YES]; 
NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:locationDescriptor, lastNameDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

// Create and initialize the fetch results controller. 
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"location" cacheName:nil]; 
self.fetchedResultsController = aFetchedResultsController; 
fetchedResultsController.delegate = self; 

Je pense que le problème est avec cette ligne (car il disparaît si je le supprimer):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lists == %@)", myList]; 

Ce qui se passe est quand la vue parent passe myList à le contrôleur de tableview, le simulateur se bloque juste. Aucun journal de plantage dans la console ou quoi que ce soit. C'est presque comme si l'on se contentait de prendre AGES pour régler la NSFRC.

Est-ce un problème avec le prédicat que j'utilise?

Répondre

0

Merci pour les suggestions concernant l'utilisation d'un NSSet. Après des heures de suivi de bogues, j'ai réalisé que le problème résidait dans ma méthode cellForIndexPath de la vue tabulaire (donc, sans rapport avec la NSFRC).

1

Avez-vous besoin d'utiliser NSFetchedResultsController lorsque vous obtenez le Person s de la liste passée dans tableViewController?

NSSet *people = myList.persons; 
+0

Vous devriez avoir modifié votre message original pour le demander. – indragie

1

Vous avez raison, vous pouvez simplement utiliser myList.persons, un NSFetchedResultsController n'est pas nécessaire dans cette situation.

+0

votre commentaire est confus. ma réponse fournit une alternative qui nécessite une re-conception du tableViewController. – falconcreek

+1

Désolé, j'ai probablement mal compris. Mais ta réponse est correcte. – indragie