微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用户接受位置提示后 CurrentLocation 为 nil

如何解决用户接受位置提示后 CurrentLocation 为 nil

我有一个应用,可以显示附近的表演节目。应用加载时通过 API 调用填充视图上的列表。

当我调用我的模型来加载我的表演时,我会用这样的位置管理器调用来包围它:

LocationManager.sharedInstance.runLocationBlock {                                
  var currentLocation: CLLocation!
  if(CLLocationManager.authorizationStatus() == .authorizedWhenInUse){
    currentLocation = locManager.location
    //call the API
    SessionManager.manager.request(url).responseJSON { (responseData) -> Void in
      //load objects then call the callback which ultimately populates the View...
      callback()      
    }}
  }
}

问题是应用程序在点击 currentLocation 时会崩溃 - 说它为空。即使我用 CLLocationManager.authorizationStatus() == .authorizedWhenInUse if 语句包围它,它也会中断。请注意,下次我加载应用时一切正常,而且它知道当前位置。

我的想法是授权已经给了,但是设备还没有来得及加载位置(?)

在互联网上巡游,它说最安全的“回调”位置是在位置管理器类' (_ manager: CLLocationManager,didChangeAuthorization status: CLAuthorizationStatus) 函数中。

我明白了,但是如何在该函数中回调我的 API 调用?它在不同的模型类中。或者有没有更好的方法来做到这一点。我什至尝试添加睡眠功能来给设备一些时间。

最终,我希望应用能够:

...现在当应用加载 b/c 时它会死掉,当前位置为零。

这是我的位置经理供参考...

import Foundation
import CoreLocation

class LocationManager: NSObject,CLLocationManagerDelegate {
    static let sharedInstance = LocationManager()
    private var locationManager = CLLocationManager()
    private let operationQueue = OperationQueue()

    override init(){
        super.init()
        operationQueue.isSuspended = true
        locationManager.delegate = self
    }

    
    func locationManager(_ manager: CLLocationManager,didChangeAuthorization status: CLAuthorizationStatus) {
        if(status == .authorizedAlways || status == .authorizedWhenInUse){
            self.operationQueue.isSuspended = false            
        }else if(status == .denied){
            self.operationQueue.cancelAllOperations()
        }
    }
    
    func runLocationBlock(callback: @escaping () -> ()){

        let authState = CLLocationManager.authorizationStatus()

        if(authState == .authorizedAlways || authState == .authorizedWhenInUse){
            self.operationQueue.isSuspended = false
        }else{
            //Request permission
            locationManager.requestWhenInUseAuthorization()
        }

        let block = { callback() }

        self.operationQueue.addOperation(block)
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。