【发布时间】:2018-06-04 12:52:34
【问题描述】:
func startLocationManager() {
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
locationManager.startUpdatingLocation()
}
}
获得位置授权后,我在viewDidLoad()中调用了这个方法,然后func locationManager(_:, didUpdateLocations:)开始被调用。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let lastLocation = locations.last!
if lastLocation.timestamp.timeIntervalSinceNow < -5 {
return
}
if lastLocation.horizontalAccuracy < 0 {
return
}
var distance = CLLocationDistance(Double.greatestFiniteMagnitude)
if let location = location {
distance = lastLocation.distance(from: location)
}
if location == nil || location!.horizontalAccuracy > lastLocation.horizontalAccuracy {
location = lastLocation
if location.horizontalAccuracy <= locationManager.desiredAccuracy {
stopLocationManager()
getWeather()
}
} else if location == nil || distance < 1 {
let timeInterval = lastLocation.timestamp.timeIntervalSince(location!.timestamp)
if timeInterval > 5 {
stopLocationManager()
getWeather()
}
}
}
这就是我结束 updateLocation 的方式:
func stopLocationManager() {
locationManager.stopUpdatingLocation()
locationManager.delegate = nil
}
终于,我完美地得到了我想要的位置数据。
但是当我想通过其他方式重新获取新位置时,即已经执行locationManager.startUpdatingLocation(),仍然无法执行func locationManager(_:, didUpdateLocations:)。
我想知道如何解决这个问题。
【问题讨论】:
-
可能与您的问题无关,但您无需在每次调用
stopUpdatingLocation时都重置委托,因为调用此函数后将不会调用委托方法。另外,您确定不满足可能停止更新的if条件,因此您不会在启动后立即调用stopLocationManager?
标签: swift location cllocationmanager