web-dev-qa-db-fra.com

NSArray de NSSet - Dois-je le trier moi-même?

J'ai des données dans un NSSet et je dois les entrer dans un NSArray.

Dois-je le trier moi-même (encore une fois, cela vient de Core Data) ou puis-je le sortir dans un ordre trié?

32
Jeff

Vous pouvez spécifier un tri lorsque vous récupérez des données avec un NSFetchRequest en définissant la propriété sortDescriptors sur un tableau de NSSortDescriptors. Mais si vous l'avez déjà dans un NSSet et que vous ne voulez pas faire une autre demande de récupération, vous pouvez utiliser:

[[theSet allObjects] sortedArrayUsingDescriptors:sortDescriptors];

Cela créera un NSArray intermédiaire lorsque vous appellerez allObjects, puis un autre tableau trié par la suite, il n'est donc pas efficace à 100%, mais la surcharge devrait être négligeable pour les ensembles de données de taille raisonnable (et certainement moins que le coût du tri).

Éditer

En fait, j'avais tort - NSSet a le sortedArrayUsingDescriptors: méthode aussi. Vous pouvez donc simplement appeler [theSet sortedArrayUsingDescriptors:descriptors] et tout faire en une seule fois.

77
Ian Henry

Vous devez le trier vous-même, mais ce n'est pas très difficile ...

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sprocket" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

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

NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];    
self.sprocketArray = mutableFetchResults;

[sortDescriptors release];
[sortDescriptor release];
[mutableFetchResults release];
[request release];
8
blindjesse