2010-01-14 11 views
3

J'utilise NSFetchRequest pour récupérer certains éléments, qui pourraient être triés par Popular, ou Random. En suivant les guides, j'ai pu facilement trier les articles par popularité en utilisant NSSortDescriptor.Comment trier au hasard avec CoreData

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"popularity" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [request setSortDescriptors:sortDescriptors]; 

Mais comment les trier au hasard?

Répondre

5

Y at-il une telle chose comme un « tri aléatoire »?

Si vous voulez permute au hasard l'affichage des résultats obtenus par NSFetchedResultsController, rappelez-vous que vous peuplez votre point de vue de la table à partir d'une référence à un élément indexPath dans les résultats de votre contrôleur récupérés (-objectAtIndexPath:).

Une chose que vous pouvez faire est de mélanger un NSMutableArray (ou des tableaux) de chemins d'index, en écrivant une méthode qui mappe un chemin d'index vers un chemin d'index permuté. Cette méthode prend un chemin d'index en entrée, recherche le tableau (ou les tableaux) et crache un nouveau chemin d'index en sortie. Vous utilisez ce nouveau chemin d'index pour remplir votre vue de table. Vous pouvez également ajouter un attribut randomizerTag à votre entité Item. Vous utilisez une fonction de permutation pour générer une permutation des entiers { 1 ... n } et enregistrer ces numéros dans chaque enregistrement de votre magasin. Une fois enregistré, vous pouvez effectuer une nouvelle extraction, en appliquant un descripteur de tri qui trie sur les valeurs randomizerTag de vos enregistrements.

+0

Haha "sort aléatoire" semble contradictoire. Mais oui, ce que je veux, c'est vraiment une sorte aléatoire. Suggestion 1 ressemble à une façon de faire. Mais j'ai rencontré un comportement bizarre de la part de tableview lors de la mise en correspondance du chemin d'index avec le paramètre fetchedResults. Je vais essayer quand même. La suggestion 2 est une hackaround. J'essaierais de ne pas toucher à mes propriétés d'entité. Mais si tout le reste échoue, je vais essayer cela. – samwize

2

Je pense que vous auriez besoin de créer vos objets avec une propriété randomisée, puis trier par cela.

+0

Un guide sur la façon de créer une propriété randomisée? Cela ne crée pas une propriété int avec des nombres aléatoires, n'est-ce pas? – samwize

+0

Je pense que votre propriété au hasard va faire très bien ... –

2

Vous pouvez chercher vos objets, les mettre dans un NSMutableArray, et mélangez-le, comme indiqué ici:

What's the Best Way to Shuffle an NSMutableArray?

+0

J'utilise NSFetchedResultsController pour la table de l'iPhone, donc je ne pense pas que je devrais obtenir fetchedObjects et le trier – samwize