从最接近当前位置的NSManagedObjects排序

时间:2012-05-27 19:29:48

标签: objective-c core-data nssortdescriptor

我有一个使用两个属性定义的核心数据模型

  • (双倍)纬度
  • (双)经度

现在,我想获取这些对象并根据它们与用户当前位置的比较进行排序。我已经知道如何获取当前位置,但我仍然无法弄清楚如何根据两个属性对结果进行排序。

我搜索过类似的东西,但我仍然有点困惑。

如果有人能指出我正确的方向,那就太好了。

由于

3 个答案:

答案 0 :(得分:3)

使用比较器块进行排序非常简单

NSArray *positions = //all fetched positions
CLLocation *currentLocation   = // You said that you know how to get this.


positions = [positions sortedArrayUsingComparator: ^(id a, id b) {
    CLLocation *locationA    = [CLLocation initWithLatitude:a.latitude longitude:a.longitude];
    CLLocation *locationB    = [CLLocation initWithLatitude:b.latitude longitude:b.longitude];
    CLLocationDistance dist_a= [locationA distanceFromLocation: currentLocation];
    CLLocationDistance dist_b= [locationB distanceFromLocation: currentLocation];
    if ( dist_a < dist_b ) {
        return (NSComparisonResult)NSOrderedAscending;
    } else if ( dist_a > dist_b) {
        return (NSComparisonResult)NSOrderedDescending;
    } else {
        return (NSComparisonResult)NSOrderedSame;
    }
}

正如我刚从lnafziger那里了解到的那样,你应该向他展示有用的黑客/解决方法¹。


¹选择表单这个单词,对你来说有最积极的含义

答案 1 :(得分:2)

您可能希望将长/纬线对转换为点之间的地理距离,然后对该单个属性进行排序。

以下是一些关于某些转换方法的文章,具体取决于您要接受的近似值:http://en.wikipedia.org/wiki/Geographical_distance

答案 2 :(得分:2)

嗯,你做不到。

不仅仅是通过自己对lat / long进行排序。 :)

您需要拥有一个包含当前位置距离的属性。您可以通过添加根据需要计算的瞬态属性或创建具有距离的另一个数组(可能更容易)来实现此目的。

要计算距离当前位置的距离,请使用以下方法:

CLLocation *currentLocation   = // You said that you know how to get this.
CLLocation *storedLocation    = [CLLocation initWithLatitude:object.latitude 
                                                   longitude:object.longitude];
/*
 * Calculate distance in meters
 * Note that there is a bug in distanceFromLocation and it gives different
 * values depending on whether you are going TO or FROM a location. 
 * The correct distance is the average of the two:
 */
CLLocationDistance *distance1 = [currentLocation distanceFromLocation:storedLocation];
CLLocationDistance *distance2 = [storedLocation distanceFromLocation:currentLocation];
CLLocationDistance *distance  = distance1 / 2 + distance2 / 2;