为什么位置管理员不止一次拨打startUpdatingLocation
?有时它会调用一次,有时它会调用三次。我不知道为什么;也许你可以帮助我。我有来自GitHub的代码。
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate
{
let locationManager = CLLocationManager()
override func viewDidLoad()
{
super.viewDidLoad()
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
self.locationManager.requestWhenInUseAuthorization()
self.locationManager.startUpdatingLocation()
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error) -> Void in
if (error != nil)
{
print("Error: " + error!.localizedDescription)
return
}
if placemarks!.count > 0 {
if let pm = placemarks?.first {
self.displayLocationInfo(pm)
}
}
else
{
print("Error with the data.")
}
})
}
func displayLocationInfo(placemark: CLPlacemark)
{
self.locationManager.stopUpdatingLocation()
print(placemark.locality)
print(placemark.postalCode)
print(placemark.administrativeArea)
print(placemark.country)
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError)
{
print("Error: " + error.localizedDescription)
}
}
答案 0 :(得分:3)
是的,这是标准行为。当您启动位置服务时,您通常会收到一系列越来越准确的CLLocation
更新(即horizontalAccuracy
随着时间的推移而减少),因为设备会预热"。例如,它可能会开始报告它可能已经基于单元塔的位置信息,但随着GPS芯片获得更多信息,它可以更好地对您的位置进行三角测量,它将为您提供更新。等
如果您想减少此行为,一旦获得要进行地理编码的位置,就可以结合使用较大的distanceFilter
,较低的desiredAccuracy
或stopUpdatingLocation
来调用stopUpdatingLocation
。
现在您正在调用reverseGeocodeLocation
,但您正在从异步调用的reverseGeocodeLocation
闭包中执行此操作。这意味着在调用stopUpdatingLocation
的完成处理程序之前,更多位置更新可以滑入。如果您同步拨打reverseGeocodeLocation
(例如在{{1}}之前),那么您将避免此行为。