我正在制作一个应用程序,其中我想在表视图中向用户显示从最近到最远的位置。我正在使用此功能来计算用户位置和这些位置之间的距离:
var distanceToUsersCurrentLocation: Double {
let manager = CLLocationManager()
let destinationCoordinates = CLLocation(latitude: (self.getLat() as NSString).doubleValue, longitude: (self.getLon() as NSString).doubleValue)
let selfCoordinates = CLLocation(latitude: (manager.location?.coordinate.latitude)!, longitude: (manager.location?.coordinate.longitude)!)
return selfCoordinates.distance(from: destinationCoordinates)
现在要对数组进行排序,我正在使用此函数:
self.ListeChantiers?.sort(by: {ji,jij in ji.distanceToUsersCurrentLocation.isLess(than:jij.distanceToUsersCurrentLocation)})
这是可行的,但问题是它占用了太多时间。有人可以告诉我这是强制性的还是有更快的解决方案? 感谢您的阅读(也许有帮助)!
答案 0 :(得分:2)
计算经纬度之间的距离非常耗时。您的代码为每个比较重复两次该转换。不要那样做对于一个非常好的排序算法,它将纬度/经度对转换为大约2•n•log(n)倍的距离
您的var distanceToUsersCurrentLocation
是数组中对象的属性吗?如果是这样,请将其更改为惰性变量。这样,它将在您第一次需要它时进行计算,然后在以后将其视为常量。
要使用惰性变量,您的对象将需要是一个类,而不是结构(引用类型,而不是值类型)。
如果数据对象是一个结构,并且不能将其更改为类,则可能需要将结构数组映射到类型(Chantier,Double)的元组数组,对元组数组和映射进行排序得到的数组将返回Chantier对象数组