2009-07-03 5 views
3

J'ai un tableau d'objets CLLocation et j'aimerais pouvoir les comparer pour obtenir la distance d'un objet CLLocation de départ. Les calculs sont simples, mais je suis curieux de savoir s'il existe un descripteur de tri pratique pour ce faire? Dois-je éviter NSSortDescriptor et écrire une méthode de comparaison personnalisée + tri à bulles? Je compare habituellement au plus 20 objets, il n'a donc pas besoin d'être super efficace.NSSortDescriptor pour comparer des objets CLLocation dans Cocoa/iPhone

Répondre

14

Vous pouvez écrire une simple classe compareToLocation: pour CLLocation qui renvoie NSOrderedAscending, NSOrderedDescending ou NSOrderedSame en fonction des distances entre self et l'autre objet CLLocation. Ensuite, il suffit de faire quelque chose comme ceci:

NSArray * mySortedDistances = [myDistancesArray sortedArrayUsingSelector:@selector(compareToLocation:)]; 

Edit:

Comme ceci:

//CLLocation+DistanceComparison.h 
static CLLocation * referenceLocation; 
@interface CLLocation (DistanceComparison) 
- (NSComparisonResult) compareToLocation:(CLLocation *)other; 
@end 

//CLLocation+DistanceComparison.m 
@implementation CLLocation (DistanceComparison) 
- (NSComparisonResult) compareToLocation:(CLLocation *)other { 
    CLLocationDistance thisDistance = [self distanceFromLocation:referenceLocation]; 
    CLLocationDistance thatDistance = [other distanceFromLocation:referenceLocation]; 
    if (thisDistance < thatDistance) { return NSOrderedAscending; } 
    if (thisDistance > thatDistance) { return NSOrderedDescending; } 
    return NSOrderedSame; 
} 
@end 


//somewhere else in your code 
#import CLLocation+DistanceComparison.h 
- (void) someMethod { 
    //this is your array of CLLocations 
    NSArray * distances = ...; 
    referenceLocation = myStartingCLLocation; 
    NSArray * mySortedDistances = [distances sortedArrayUsingSelector:@selector(compareToLocation:)]; 
    referenceLocation = nil; 
} 
+0

Pouvez-vous donner un exemple de ce? –

+0

@Kevin - J'ai édité le message pour inclure un exemple –

+1

J'ai essayé de l'implémenter exactement comme vous l'avez ici. La variable statique est toujours nulle et ne peut donc pas être triée. Est-ce que je manque quelque chose? –

1

Juste pour ajouter à la réponse de la catégorie (ce qui est le chemin à parcourir), ne pas oublier vous n'avez pas réellement besoin de faire des calculs vous-même, vous pouvez utiliser la méthode d'instance CLLocation:

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location 

Pour obtenir la dis entre deux objets de localisation.

2

Pour améliorer la réponse de Dave ...

Comme d'iOS 4, vous pouvez utiliser un bloc comparateur et éviter d'avoir à utiliser une variable statique et catégorie:

NSArray *sortedLocations = [self.locations sortedArrayUsingComparator:^NSComparisonResult(CLLocation *obj1, CLLocation *obj2) { 
    CLLocationDistance distance1 = [targetLocation distanceFromLocation:loc1]; 
    CLLocationDistance distance2 = [targetLocation distanceFromLocation:loc2]; 

    if (distance1 < distance2) 
    { 
     return NSOrderedAscending; 
    } 
    else if (distance1 > distance2) 
    { 
     return NSOrderedDescending; 
    } 
    else 
    { 
     return NSOrderedSame; 
    } 
}]; 
+0

Je pense que ce devrait être "obj1", "obj2, au lieu de" loc1 "," loc2 "dans la distance de l'emplacement. – Pochi

Questions connexes