我正试图获得两个地点之间的距离。我的代码突然工作,distanceFromLocation
开始输出NaN
。
我已尝试设置speed
,course
以及所有内容,但不会改变任何内容。
模拟器和设备上都是一样的(iOS 9.3.4,Xcode 7.3.1)。
代码
let pLocation = CLLocation(latitude: p.coordinate.latitude, longitude: p.coordinate.longitude)
let centerLocation = CLLocation(latitude: self.mapView.centerCoordinate.latitude, longitude: self.mapView.centerCoordinate.longitude)
let meters = centerLocation.distanceFromLocation(pLocation)
print("\n\(pLocation)\n\(centerLocation)\n\(meters)")
输出
<+51.50889700,-0.13142600> +/- 0.00m (speed -1.00 mps / course -1.00) @ 22/08/2016 13:15:41 heure d’été d’Europe centrale
<+51.50998000,-0.13370000> +/- 0.00m (speed -1.00 mps / course -1.00) @ 22/08/2016 13:15:41 heure d’été d’Europe centrale
nan
修改
在git bisect
之后,我终于设法追踪了最多3行的错误。我仍然不知道为什么或如何导致错误。
为了给你一些上下文,每次mapView
区域发生变化时都会调用此函数。当它发生时,我只在mapView
位移超过一定限度(超过300米)时才执行动作。
func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
if let c = lastCenter {
// Those 3 next lines are the culprits
let loc1 = CLLocation(latitude: c.latitude, longitude: c.longitude)
let loc2 = CLLocation(latitude: self.mapView.centerCoordinate.latitude, longitude: self.mapView.centerCoordinate.longitude)
if loc1.distanceFromLocation(loc2) > regionRadius {
// ...
}
} // ...
}
EDIT2 - 解决方案/修复
奇怪的是,只需将这个逻辑移到另一个函数就可以了,就像这样:
func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
delay(1, closure: {
self.checkShouldReloadForRegionChange()
})
}
func checkShouldReloadForRegionChange() {
// Check that user moved enough
if let c = lastCenter {
let loc1 = CLLocation(latitude: c.latitude, longitude: c.longitude)
let loc2 = CLLocation(latitude: self.mapView.centerCoordinate.latitude, longitude: self.mapView.centerCoordinate.longitude)
if loc2.distanceFromLocation(loc1) < regionRadius {
return
}
}
// Do stuff ...
}
您会看到checkShouldReloadForRegionChange
来电被延迟,因为问题仍然存在。