【问题标题】:How to get CLLocationManager result before all viewDidLoad stuff loads?如何在所有 viewDidLoad 内容加载之前获取 CLLocationManager 结果?
【发布时间】:2017-11-18 12:33:50
【问题描述】:

请检查代码:

 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() 函数的结果。 问题:是否有可能在所有其他功能运行之前获得坐标?如果是,请描述如何?

【问题讨论】:

  • 您可以使用所有 LocationManager 逻辑定义一个单例类,并在您的 appDelegate 中初始化该类
  • @ReinierMelian 当然,这样做可能会有所改善。但是我们真的可以确定我们会在在第一个视图控制器出现之前得到我们的位置吗?在一般情况下,我不这么认为......
  • 不。通常,您需要将这些其他功能移到您的 locationManager(_:didUpdateLocations) 方法中。不过有一个想法:您可以从某种默认位置(或者可能是用户的最后一个位置)开始吗?如果是这样,您可以将其存储在UserDefaults 中并将其拉出viewDidLoad 以供最初使用的功能。然后,当实际位置信息返回时,您可以使用新数据进行适当的响应。

标签: ios swift uiviewcontroller cllocationmanager


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 2016-10-27
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多