我得到以下函数来获取最接近用户位置的对象。还有其他方法吗?我想让我的代码更清晰。是否可以使用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;
}
答案 0 :(得分:2)
为了使其更具可读性,您可以将for循环更改为
for (MyZone *curZone in zoneArr.count) {
..
}
并且可能将CLLocationCoordinate2D和CLLocation之间的距离计算和转换移动到MyZone类的新方法中。
答案 1 :(得分:1)
您可以使用方法indexOfObjectPassingTest调用并传入一个块,该块选择距离最接近当前位置的对象。我不知道你是否会认为更清楚。
如果您反复执行此操作,或者在大量位置上执行此操作,则为每个位置创建CLLocation对象的开销将变得非常重要。您可能希望将一个CLLocation属性添加到MyZone类,并将对象的位置保存在CLLocation中,而不是使用lat / long值。这样,每次要查找最近的对象时,都可以避免为数组中的每个条目创建CLLocation对象。 CLLocation符合NSCoding,因此您可以合理地将其保存到失败状态......