获得最接近元素的最佳方式

时间:2014-01-27 13:45:57

标签: objective-c nspredicate min

我得到以下函数来获取最接近用户位置的对象。还有其他方法吗?我想让我的代码更清晰。是否可以使用NSPredicate解决此问题?对象MyZone包含CLLocationCoordinate2D

- (MyZone *)closestBaseAgglomeration {
    CLLocation *userLocation = self.locationManager.location;
    NSArray *zoneArr = //Get zone array here
    CLLocationDistance minDist = CGFLOAT_MAX;
    MyZone *closestZone = nil;
    for (int it=0; it<zoneArr.count; it++) {
        MyZone *curZone = [zoneArr objectAtIndex:it];
        CLLocationCoordinate2D curCoordinate = curZone.coordinateRegion.center;
        CLLocation *curLocation = [[CLLocation alloc] initWithLatitude:curCoordinate.latitude longitude:curCoordinate.longitude];
        CLLocationDistance actDist = [curLocation distanceFromLocation:userLocation];
        if (minDist > actDist) {
            closestZone = curZone;
            minDist = actDist;
        }
    }
    return closestZone;
}

2 个答案:

答案 0 :(得分:2)

为了使其更具可读性,您可以将for循环更改为

for (MyZone *curZone in zoneArr.count) {
..
}

并且可能将CLLocationCoordinate2D和CLLocation之间的距离计算和转换移动到MyZone类的新方法中。

答案 1 :(得分:1)

您可以使用方法indexOfObjectPassingTest调用并传入一个块,该块选择距离最接近当前位置的对象。我不知道你是否会认为更清楚。

如果您反复执行此操作,或者在大量位置上执行此操作,则为每个位置创建CLLocation对象的开销将变得非常重要。您可能希望将一个CLLocation属性添加到MyZone类,并将对象的位置保存在CLLocation中,而不是使用lat / long值。这样,每次要查找最近的对象时,都可以避免为数组中的每个条目创建CLLocation对象。 CLLocation符合NSCoding,因此您可以合理地将其保存到失败状态......