SM654321
SM654321

Reputation: 89

CLLocationManager requestLocation not calling didUpdateLocations

I have a simple CLLocationManager implementation that works in one project but not in my new project.

The code is almost identical but I cannot get the .didUpdateLocations function to call. My code is below. Any ideas why I cannot get the update to work? I'm at a loss, I've build many apps using location services and never seen this situation.

Also I have the three settings in the PLIST set correctly for Privacy-Location Always etc.

There are no errors given, it simply doesn't call .didUpdateLocations

Weather Class

class DarkSkyWeatherController: UIViewController, CLLocationManagerDelegate {

    var weatherGetterDelegate: DarkSkyWeatherControllerDelegate?
    var locationManager = CLLocationManager()
    var lat = String()
    var long = String()


    func getLocation() {

        // Ask for Authorisation from the User.

         locationManager.requestAlwaysAuthorization()

         // For use in foreground
         locationManager.requestWhenInUseAuthorization()

         if CLLocationManager.locationServicesEnabled() {
             locationManager.delegate = self
             locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
             locationManager.startUpdatingLocation()
         }

        locationManager.delegate = self
        locationManager.requestLocation()

    }


    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print(error)
    }


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

        guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else {return}
        print("locations = \(locValue.latitude) \(locValue.longitude)")


        lat = String(locValue.latitude)
        long = String(locValue.longitude)

        getDarkSkyWeather { (fetchedInfo) in
            if let myFetchedInfo = fetchedInfo {
                self.weatherGetterDelegate?.getMyWeather(weather: myFetchedInfo)
            }
        }
    }

ViewDidLoad in main window


        let weather = DarkSkyWeatherController()
        weather.weatherGetterDelegate = self
        weather.getLocation()

Thanks for looking at this.

Upvotes: 1

Views: 1022

Answers (1)

asaura
asaura

Reputation: 36

Without seeing your full main window code, I bet that the problem is with the scope and lifecycle of your controller:

override func viewDidLoad() {
  let weather = DarkSkyWeatherController()
  weather.weatherGetterDelegate = self
  weather.getLocation()
  // Function exits. The weather constant dies off. 
  // This is why you don't get callbacks.
}

Do the following, instead.

let weather = DarkSkyWeatherController()
override func viewDidLoad() {
  weather.weatherGetterDelegate = self
  weather.getLocation()
  // Function exits, but the weather constant lives on as a field of your main ViewController. You'll get your callbacks now.
}

Upvotes: 2

Related Questions