2012-01-27 2 views
2

J'ai un NSFetchRequest qui obtient des objets à partir de données de base et de les trier en utilisant un trivial NSSortDescriptor. J'utilise deux différents ceux en fonction de ce que l'utilisateur sélectionne, mais ils sont comme ça:NSSortDescriptor - la commande a-t-elle été modifiée?

NSMutableArray *sortDescriptors = [NSMutableArray array]; 
    NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"ownerName" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
    NSSortDescriptor *sortDescriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"petName" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
    [sortDescriptors addObject:sortDescriptor1]; 
    [sortDescriptors addObject:sortDescriptor2]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

Tout fonctionne comme prévu sur iOS5 et 5.1, mais quand je teste exactement le même code sur un iOS4 en cours d'exécution iPad. 2.1 (ou le simulateur 4.3) l'ordre de tout le premier descripteur de tri est inversé. Dans cet exemple, les noms des propriétaires sont classés de Z à A, mais les familiers sont correctement ordonnés de A à Z!

Y a-t-il eu un bogue dans les versions antérieures d'iOS qui a provoqué l'erreur du booléen ascending? Sinon, y a-t-il autre chose que je puisse mal faire?

EDIT: La première clé (ownerName) est utilisée comme section NSFetchedResultsController. Je ne sais pas si c'est pertinent.

Merci Craig

+0

Obtenez-vous le bon ordre si vous passez 'NO' pour le paramètre' ascending'? – Mundi

+0

Oui. J'ai changé le caractère «ascendant» sur le premier SD à NO, et puis reflète le résultat iOS5. Le deuxième SD était toujours défini sur OUI et les articles de la section étaient ordonnés de la même manière. Bizarre! –

Répondre

0

Juste deviner.

J'ai eu de bons résultats sans spécifier caseInsensitiveCompare:.

En outre, à proprement parler, NSFetchRequest attend un NSArray comme argument sortDescriptors, et non NSMutableArray. Dans l'ensemble du code de l'échantillon d'Apple, il est normalement quelque chose comme

[fetchRequest setSortDescriptors: 
    [NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]]; 

erreurs que j'ai eu comme ça (à l'aide mutable au lieu de immuable), mais souvent aussi tout fonctionne. Peut-être que changer ça vaut le coup d'essayer.

+0

Merci! J'ai essayé de supprimer le 'caseInsensitiveCompare' mais pas différent. Je vais essayer de changer le tableau mutable en tableau, demain pour voir si cela fait une différence. –

+0

Je peux confirmer que cela ne fait aucune différence :( –

+0

En ce qui concerne 'NSMutableArray' vs' NSArray', comme 'NSMutableArray' est une sous-classe de' NSArray', il sera lancé automatiquement quand vous le passerez, donc cela ne vous causera pas Dans un système OO sain, chaque sous-classe devrait pouvoir remplacer sa superclasse. –

Questions connexes