NSFetchedResultsController: deux descripteurs de tri avec la même clé ne fonctionnent pas. Un descendant pour les sections, l'autre croissant pour les

J'utilise un NSFetchedResultsController pour remplir un TableView. Je souhaite que les sections soient triées par date et que les lignes soient triées par date. Les deux utilisent la clé 'creation' et les sections ont une propriété transitoire pour le sectionNameKeyPath qui retourne une chaîne pour la date avec le formulaire: "Today, Yesterday, 20.11.2013, 19.11.2013, ..." créé à partir de la date 'création' . Cependant, les lignes sont toujours triées dans l'ordre du premier descripteur de tri. Cette approche est-elle incorrecte?

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Exercise"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creation" ascending:NO],
                            [NSSortDescriptor sortDescriptorWithKey:@"creation" ascending:YES]];

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                    managedObjectContext:self.context
                                                                      sectionNameKeyPath:@"localizedCreationDate"
                                                                               cacheName:nil];

Je suis reconnaissant pour toute aide fournie! br

MISE À JOUR

L'approche ci-dessus ne peut pas fonctionner. :) Je l'ai résolu en sauvegardant une deuxième date comme une propriété au début de la journée, ordonnée en descendant. Ceci est également utilisé comme sectionNameKeyPath. De plus, pour les titres d'en-tête de section, la fonction localizedCreationDate est utilisée.

- (void)setuptFetchedResultsController
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"DNALoggedExercise"];
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDayDate" ascending:NO],
                                [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.context
                                                                          sectionNameKeyPath:@"creationDayDate"
                                                                                   cacheName:nil];
}
0

1 Réponses

Dans votre premier morceau de code, vous donnez deux NSSortDescriptors contradictoires, donc un seul est considéré, et probablement le premier.

En créant une deuxième propriété de date juste pour plus de commodité, vous introduisez la duplication de données dans votre base de données, ce n'est pas une très bonne idée. Pourquoi ne pas trier vos résultats dans n'importe quel ordre, et simplement lire le tableau à l'envers dans cellForRowAtIndexPath ou titleForHeaderInSection ? Encore mieux, pourquoi ne pas avoir une petite méthode privée dans votre viewController qui permettrait de préparer un NSDictionary ou toute autre structure de données de commodité pour une utilisation ultérieure?

0
ajouté
J'ai déjà essayé l'approche et rencontré quelques problèmes lors de l'insertion/suppression de lignes. Tout s'est déroulé comme prévu, sauf que TableVIew n'a pas été rempli lorsque la ligne d'extraction a été supprimée et qu'une entité a été ajoutée à nouveau. Mais tu as raison. C'est mieux que la duplication de données et je vais essayer à nouveau de rapporter les résultats. :)
ajouté l'auteur denrase, source