Функции делегата CoreLocation не запускаются, пока не завершится функция viewDidLoad контроллера представления

Это более чем вероятно, что-то очень легко решить, но я занимался этим в течение некоторого времени и, похоже, не могу найти ответ.

Я хотел бы знать, почему метод делегата для CLLocationManager не срабатывает, пока после ViewDidLoad функция, когда CLLocationManager загружен в пределах ViewDidLoad функция.

Я установил для моего региона по умолчанию Сидней Австралия в своей схеме приложений и инкапсулировал свой locationManager в его собственный класс следующим образом:

import UIKit
import CoreLocation

/* Class location is a class to track user location and return a location object. */
class usrLocation: NSObject, CLLocationManagerDelegate
{
    //MARK: Properties
    var locationMgr: CLLocationManager!
    var location: CLLocation!
    var seenError: Bool = false

    //MARK: Public Methods

    func startTracking() {
        locationMgr = CLLocationManager()
        locationMgr.delegate = self
        locationMgr.desiredAccuracy = kCLLocationAccuracyBest
        locationMgr.requestWhenInUseAuthorization()
        locationMgr.startUpdatingLocation()
    }

    //Return a location object
    func getLocation() -> CLLocation {
        locationMgr.startUpdatingLocation()
        return location!
    }

    //MARK: CLLocationManagerDelegate
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        locationMgr.stopUpdatingLocation()

        if (seenError == false) {
            seenError = true
            print(error)
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        location = (locations ).last
        locationMgr.stopUpdatingLocation()
    }
}

Я инициализировал класс в моем ViewController и попробуйте начать отслеживать мое текущее местоположение в viewDidLoad,

Код выглядит так.

override func viewDidLoad() {
    var location = usrLocation()
    override func viewDidLoad() {
    super.viewDidLoad()

    // Track location 
    location.startTracking()
    location.getLocation()

    //update Label text
    sLongitude.text = "\(location.getLocation().coordinate.longitude)"
    sLatitude.text = "\(location.getLocation().coordinate.latitude)"    
}

getLocation() никогда не возвращает местоположение, поскольку оно всегда равно нулю в качестве делегата didUpdateLocations функция не работает. Почему это?

1 ответ

Я попытался заставить это работать, используя обработчик завершения, но не смог, поэтому мое решение состояло в том, чтобы игнорировать установку текста метки через viewDidLoad и вместо этого обновлять метки после того, как переменная местоположения была установлена. Таким образом, viewDidLoad завершается, делегат вызывается, а метки обновляются.

var location: CLLocation! {

didSet {
    //update Label text
    sLongitude.text = "\(location.getLocation().coordinate.longitude)"
    sLatitude.text = "\(location.getLocation().coordinate.latitude)"    
}

}
Другие вопросы по тегам