如何在加载所有 viewDidLoad 内容之前获取 CLLocationManager 结果?

How to get CLLocationManager result before all viewDidLoad stuff loads?

请检查代码:

 let manager = CLLocationManager()

//Location manager to determine the current location
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location = locations[0]
    lat = location.coordinate.latitude
    lon = location.coordinate.longitude
    let currentLocation = CLLocation(latitude: lat!, longitude: lon!)
}

我在 viewDidLoad() 中还有更多功能:

override func viewDidLoad() {
    super.viewDidLoad()

    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()

    //Here i want to get the result immediately, but...
    manager.startUpdatingLocation()

   parseJSONfunction()
   anotherFunction()
   anotherFunction2()
   ...}

因此,在加载所有 viewDidLoad() 内容之前,我无法获得 manager.startUpdatingLocation() 函数的结果。 问题:是否可以在所有其他函数运行之前获取坐标?如果是,请描述如何?

问题:是否可以在所有其他函数运行之前获取坐标?

一句话,没有。位置管理器是异步的。您要求它开始更新您的位置,它会启动 GPS 并尝试进行修复(它还使用手机信号塔、WiFi 基站等)。可能需要几秒钟(或更长时间)才能获得相当准确的位置正在阅读。

当我编写位置感知应用程序时,我通常会启动位置管理器,并在我的 locationManager(_:didUpdateLocations:) 方法中检查结果的水平精度,并且仅在它至少相当准确时才采用它。这可能需要更长的时间。

如果你加载 viewController 它是同步的。系统进行设置,这会导致各种框架调用触发,然后 viewDidLoad 被调用,一旦视图加载,同步。如果您在用户要求显示新视图控制器时启动位置管理器,则您不可能在调用 viewDidLoad 时修复位置。

如果你加载你的应用程序,让应用程序委托调用一个单例来开始位置更新,然后等待用户切换到你的另一个屏幕,然后你在 viewDidLoad 期间向单例询问位置你有一个获得良好位置读数的好机会,但即便如此也不确定。