Почему в viewDidLoad диспетчер местоположений не равен нулю, а функция didUpdateLocations не вызывается? Я использую реальное устройство? - PullRequest
0 голосов
/ 26 апреля 2019

Я использую реальное устройство для определения текущего местоположения, проблема в том, что locationManager.location - это nil, а функция didUpdateLocations не вызывается.

var location = CLLocationManager()
@IBOutlet weak var map: MKMapView!

override func viewDidLoad() {
    super.viewDidLoad()
    map.showsPointsOfInterest = true
    map.showsScale = true
    map.showsUserLocation = true

    locationManagerConfiguration()
}
func locationManagerConfiguration(){
    location.requestAlwaysAuthorization()
    location.requestWhenInUseAuthorization()
    if CLLocationManager.locationServicesEnabled(){
        location.delegate = self
        location.desiredAccuracy = kCLLocationAccuracyBest
        location.startUpdatingLocation()
    }

    let sourceCoordinates = location.location?.coordinate
    let sourcePlacemark = MKPlacemark(coordinate: sourceCoordinates! 

- вот проблема sourceCoordinateноль

1 Ответ

0 голосов
/ 26 апреля 2019

Код, который вы предоставили, не соответствует утверждению в вашем вопросе, но я думаю, что вижу проблему в коде.Согласно документам Apple: Startupdatinglocation

location.startUpdatingLocation()

Асинхронная функция, для получения которой требуется несколько секунд.Функция немедленно вернется, но обратный вызов делегата будет вызван, когда система получит местоположение GPS (через несколько секунд, асинхронно).Ваш код выше вызывает startUpdatingLocation() и сразу ожидает, что значение будет присутствовать (синхронно, чего никогда не будет).Ваш код должен быть больше похож на:

func locationManagerConfiguration(){
    location.requestAlwaysAuthorization()
    location.requestWhenInUseAuthorization()
    if CLLocationManager.locationServicesEnabled(){
        location.delegate = self
        location.desiredAccuracy = kCLLocationAccuracyBest
        location.startUpdatingLocation()
    }
}

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

    // TODO: Check the array is not empty
    let sourceCoordinates = locations[0]
    let sourcePlacemark = MKPlacemark(coordinate: sourceCoordinates!)
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("Location error: \(error)")
}
...