为什么 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 之前),那么您将避免这种行为。