gpt4 book ai didi

swift - 在第一次加载 requestAuthorization 之后,viewDidLoad 的其余部分未执行,下一行跳转到委托(delegate)函数 (swift 3)

转载 作者:可可西里 更新时间:2023-11-01 02:01:50 30 4
gpt4 key购买 nike

我的应用似乎在每次使用时都运行良好,但第一次除外。我要求用户授权,并且我在 plist 中有适当的键,但是在请求授权的行之后的其余 viewDidLoad 不执行。我在下面附加了断点,断点 2 没有在第一次使用该应用程序时命中。

我很确定在获得授权后它会跳转到扩展中的 func locationManager。

我可以等到最后才请求授权,直到一切都准备就绪,但不确定这是最好的还是唯一的出路。

谢谢,

 class MapController: UIViewController, GMSMapViewDelegate {

var locationManager = CLLocationManager()
var currentLocation: CLLocation?

@IBOutlet var mapView: GMSMapView!

override func viewDidLoad(){
super.viewDidLoad()

locationManager = CLLocationManager()
--------------------------> breakpoint 1
locationManager.requestAlwaysAuthorization()
locationManager.requestWhenInUseAuthorization()
-------------------------> breakpoint 2
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.distanceFilter = 50
locationManager.startUpdatingLocation()
locationManager.delegate = self

guard let lat = locationManager.location?.coordinate.latitude else {return}
guard let lng = locationManager.location?.coordinate.longitude else {return}

mapView.settings.compassButton = true
mapView.settings.myLocationButton = true
mapView.isMyLocationEnabled = true

let camera = GMSCameraPosition.camera(withLatitude: lat, longitude: lng, zoom: 1)
mapView.camera = camera
mapView.delegate = self
getData()
}

extension MapController: CLLocationManagerDelegate {

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

guard let location: CLLocation = locations.last else {return}
let camera = GMSCameraPosition.camera(withLatitude: location.coordinate.latitude, longitude: location.coordinate.longitude, zoom: 1)

mapView.animate(to: camera)
}
}

最佳答案

为什么要请求对两件不同的事情的授权?如果您请求并获得 always 授权,则在使用时无需请求授权,因为这只是 always 授权的一个子集。

此外,这些都是异步函数,因此您不能在它们之后立即执行基于位置的代码,因为如果您还没有授权,紧接在 requestAuthorization() 之后的代码将在之前执行您实际上获得了授权,因此不会调用函数,因为您还没有授权。

您必须在调用任何与位置相关的代码之前检查授权状态,例如 locationManager.startUpdatingLocation() 并且只有在状态被授权时才执行与位置相关的代码。如果未授权,则必须执行 CLLocationManagerDelegatelocationManager(_:didChangeAuthorization:) 函数,并在检查结果后调用该函数内的位置相关调用更改为授权状态。

关于swift - 在第一次加载 requestAuthorization 之后,viewDidLoad 的其余部分未执行,下一行跳转到委托(delegate)函数 (swift 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45710475/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com