2010-01-25 5 views
0

J'utilise NSFetchedResultsController à peu près out-of-box de la manière décrite par la documentation. Voici un extrait de mon code.Données de base: communication de contexte supplémentaire aux objets récupérés avec NSFetchedResultsController?

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity" 
              inManagedObjectContext:moc]; 
[fetchRequest setEntity:entity]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release]; 

NSPredicate *somePredicate = [NSPredicate predicateWithFormat:@"ANY buckets.name == %@", bucketId]; 
[fetchRequest setPredicate:somePredicate]; 

frc = [[NSFetchedResultsController alloc] 
     initWithFetchRequest:fetchRequest 
     managedObjectContext:moc 
     sectionNameKeyPath:@"titleAccessor" 
     cacheName:@"frc"]; 
[fetchRequest release]; 

avis deux choses:

1) le prédicat. Dans mon modèle de données, SomeEntity et les buckets ont une relation many-to-many. Le prédicat dit "renvoyer tous les objets SomeEntity dont l'objet de compartiment associé porte ce nom". Fonctionne comme prévu

2) J'utilise sectionNameKeyPath. Il s'agit en fait d'une méthode dans l'objet modèle qui effectue un calcul en fonction de la logique de l'application et renvoie le titre. Fonctionne comme prévu

Maintenant, la question:

Comment puis-je connecter ces deux choses et rendre la méthode « titleAccessor » conscient du prédicat? Je voudrais que les titres de section soient différents selon le prédicat (pour être précis, en fonction de l'attribut bucketId que j'utilise dans le prédicat). Pour préciser:

en ce moment le titleAccessor fonctionne si:

return @"result of some calculation" 

Je voudrais le faire fonctionner de manière:

if (bucketId == a): 
    return @"aPrefix" + @"result of some calculation" 
else if (bucketId == b): 
    return @"bPrefix" + @"result of some calculation" 

J'ai deux trains de pensée: 1) si cela était une extraction de CD normale (s'il y a une telle chose), je pourrais simplement définir une propriété volatile des objets du modèle et l'utiliser. Mais, je n'ai pas accès aux objets de résultat NSFetchedResultsController. 2) si c'était SQL, je ferais quelque chose comme 'sélectionnez a, b, c comme "quelque chose" de blah;' à l'exécution, où "c" serait alors la valeur désirée et je pourrais alors l'utiliser comme une propriété. Mais, ce n'est pas SQL. :)

Comment puis-je accomplir le comportement souhaité décrit ci-dessus?

MISE À JOUR:

Bien sûr, vous trouver la réponse vous-même juste après l'affichage de la question. (Je suppose que l'affichage fait partie de la thérapie.) Je viens de réaliser que je mets ce qui suit dans mon délégué tableviewcontroller que la documentation dit:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[frc sections] objectAtIndex:section]; 
    return [sectionInfo name]; 
} 

je pouvais faire le nécessaire mangling ici. Est-ce la meilleure approche? Dites "oui" et faites quelques points faciles. :) (ou suggérer une approche encore meilleure.)

Répondre

0

Cela semble être l'approche la plus propre à laquelle je puisse penser. Il n'y a aucun moyen que je sache qu'une entité puisse revenir au prédicat qui l'a récupérée.

+0

Également bon pour la séparation MVC, gardez l'interface utilisateur hors de M et laissez VC faire la conversion aux chaînes UI. – Jaanus

Questions connexes