3

J'utilise un NSFetchedResultsController pour remplir un UITableView avec des résultats d'un magasin de taille moyenne de base de données de 1500 ~ entités. Le contrôleur de résultats est assez standard - certains "points chauds" pour les bogues potentiels ne sont pas vrai de cette configuration.Les noms des sections de NSFetchedResultsController ne correspondent pas à l'objet géré valeurs

  • contexte de l'objet géré créé sur le même (principal) fil comme utilisé sur
  • Aucun cache est utilisé (car le tri change fréquemment)
  • Un sectionNameKeyPath est utilisé pour diviser les résultats en sections
  • cependant,

Mes résultats de la section, sont très étrange. Par exemple, considérons cette méthode utilisée pour définir les titres pour les vues d'en-tête de section:

- (NSString *)titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.resultsController sections] objectAtIndex:section]; 
    return [sectionInfo name]; // <------- Stopped at breakpoint here 
} 

Je me suis arrêté à la ligne indiquée à l'aide d'un point d'arrêt et, en utilisant GDB, a examiné les éléments suivants:

(gdb) po [[self resultsController] sectionNameKeyPath] 
reviewDateString 
(gdb) print section 
$11 = 1 
(gdb) print (int) [sectionInfo numberOfObjects] 
$12 = 4 
(gdb) po [sectionInfo name] 
Wednesday, September 8th 2010 
(gdb) po [[[sectionInfo objects] objectAtIndex:0] valueForKey:@"reviewDateString"] 
Sunday, February 13th 2011 
(gdb) po [[[sectionInfo objects] objectAtIndex:1] valueForKey:@"reviewDateString"] 
Sunday, February 13th 2011 
(gdb) po [[[sectionInfo objects] objectAtIndex:2] valueForKey:@"reviewDateString"] 
Sunday, February 13th 2011 
(gdb) po [[[sectionInfo objects] objectAtIndex:3] valueForKey:@"reviewDateString"] 
Sunday, February 13th 2011 

la question devrait être évident - pourquoi ne pas [nom sectionInfo] correspondent aux valeurs du sectionNameKeyPath pour chaque objet géré dans la section? Les objets de la section semblent être correctement groupés, le nom de la section n'est pas correctement défini.

Les résultats sont encore plus bizarre si vous regardez ceci:

(gdb) po [[self resultsController] indexPathForObject:(id)[[sectionInfo objects] objectAtIndex:0]] 
<NSIndexPath 0x6615660> 2 indexes [459, 4294966310] 

Maintenant, évidemment, de ce qui précède, le NSIndexPath retourné devrait être [1,0], pas cette valeur fausse.

Je suis complètement déconcerté. Quelqu'un a des idées? Je vais regarder cette question au cas où vous auriez besoin de plus d'informations.

[Modifier 1]

La seule chose bizarre dans ma configuration NSFetchedResultsController est que je recrée (version et alloc/init un nouveau), le contrôleur de résultats en réponse à une évolution de la sélection de UISegmentedControl. Cela se fait pour changer les sortDescriptors de la demande d'extraction et sectionNameKeyPath, de sorte que les changements de tri global.

[Edit 2]

La méthode resultsController est juste l'accesseur de propriété pour le NSFetchedResultsController que j'utilise, généré par @synthesize. Les valeurs attendues pour les noms de section sont déjà données - les noms des sections doivent être égaux aux valeurs de la clé @ "reviewDateString" (sectionNameKeyPath) que j'ai montrée juste en dessous de "po [sectionInfo name]", donc pour ce cas, ils devraient être "dimanche 13 février 2011".

+0

Pouvez-vous publier la méthode the fetchResultController? – shannoga

+0

+ 1 question intéressante et vous avez fait vos devoirs. Comme nous le verrons ci-dessus, est-ce que nous pouvons regarder votre méthode 'fetchedResultsController' et les x valeurs attendues pour vos noms de section? – Rog

Répondre

10

Vous devrez probablement corriger votre sectionNameKey sur l'extraction.

Si ce chemin de clé n'est pas le même que celui spécifié par le premier descripteur de tri dans fetchRequest, il doit générer les mêmes ordres relatifs. Par exemple, le premier descripteur de tri dans fetchRequest peut spécifier la clé d'une propriété persistante; sectionNameKeyPath peut spécifier une clé pour une propriété transitoire dérivée de la propriété persistante.

Questions connexes