NSSortDescriptor للمقارنة بين الأشياء CLLocation في الكاكاو / اي فون

StackOverflow https://stackoverflow.com/questions/1081050

سؤال

ولدي مجموعة من الأشياء CLLocation وأود أن تكون قادرة على مقارنتها للحصول على مسافة واحدة من كائن CLLocation البدء. الرياضيات هي على التوالي إلى الأمام ولكن أنا الغريب إذا كان هناك واصف الراحة نوع التوجه نحو القيام بذلك؟ يجب أن أتجنب NSSortDescriptor والكتابة مخصص مقارنة طريقة + فقاعة نوع؟ أنا عادة مقارنة في معظم 20 الأشياء، لذلك لا تحتاج إلى أن تكون فائقة الكفاءة.

هل كانت مفيدة؟

المحلول

ويمكنك إرسال compareToLocation بسيط: فئة CLLocation وترجع إما NSOrderedAscending، NSOrderedDescending، أو NSOrderedSame اعتمادا على المسافات بين الذات والآخر الكائن CLLocation. ثم ببساطة تفعل شيئا مثل هذا:

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

وتحرير:

ومثل هذا:

//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;
}

نصائح أخرى

لتحسين الجواب ديف ...

واعتبارا من دائرة الرقابة الداخلية 4، يمكنك استخدام كتلة المقارنة وتجنب الحاجة إلى استخدام ثابت متغير وفئة:

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;
    }
}];

وفقط إضافة إلى استجابة فئة (والذي هو وسيلة للذهاب)، لا تنسى أنك لا تحتاج في الواقع للقيام بأي الرياضيات نفسك، يمكنك استخدام أسلوب مثيل CLLocation:

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

لتحصل على المسافة بين كائنين الموقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top