为什么 LocationManager 会多次调用 startUpdatingLocation?
Why does LocationManager calls startUpdatingLocation multiple times?
为什么位置管理器不止一次调用 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)
}
}
是的,这是标准行为。当您启动位置服务时,您通常会收到一系列越来越准确的 CLLocation
更新(即 horizontalAccuracy
随着时间的推移而减少)作为设备 "warms up"。例如,它可能会开始报告它可能已经基于手机信号塔的位置信息,但随着 GPS 芯片获得更多信息,它可以更好地对您的位置进行三角测量,它会为您提供更新。等等
如果您想减少这种行为,您可以结合使用更大的 distanceFilter
、更小的 desiredAccuracy
,或者在您获得一个位置后调用 stopUpdatingLocation
地理编码。
现在您正在调用 stopUpdatingLocation
,但是您是从 reverseGeocodeLocation
的异步调用闭包中调用的。这意味着在调用 reverseGeocodeLocation
的完成处理程序之前可以插入更多位置更新。如果您同步调用 stopUpdatingLocation
(例如在 reverseGeocodeLocation
之前),那么您将避免这种行为。
为什么位置管理器不止一次调用 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)
}
}
是的,这是标准行为。当您启动位置服务时,您通常会收到一系列越来越准确的 CLLocation
更新(即 horizontalAccuracy
随着时间的推移而减少)作为设备 "warms up"。例如,它可能会开始报告它可能已经基于手机信号塔的位置信息,但随着 GPS 芯片获得更多信息,它可以更好地对您的位置进行三角测量,它会为您提供更新。等等
如果您想减少这种行为,您可以结合使用更大的 distanceFilter
、更小的 desiredAccuracy
,或者在您获得一个位置后调用 stopUpdatingLocation
地理编码。
现在您正在调用 stopUpdatingLocation
,但是您是从 reverseGeocodeLocation
的异步调用闭包中调用的。这意味着在调用 reverseGeocodeLocation
的完成处理程序之前可以插入更多位置更新。如果您同步调用 stopUpdatingLocation
(例如在 reverseGeocodeLocation
之前),那么您将避免这种行为。