Swift - проблема с получением нуля при установке значений между функциями

Привет, мне кажется, я могу получить nil только как переменную местоположения, пока я пишу простой класс получения местоположения. Некоторое время я искал переполнение стека и пробовал много решений, но, похоже, не могу это исправить.

Ниже мой код. Я пытаюсь методы, один из них состоит в том, чтобы установить переменные в структуре в моем методе didUpdateLocations. Другой - просто обновить переменную userLocation. Оба сейчас дают мне ноль, и я не могу понять, почему.

class SendLocation:  NSObject, CLLocationManagerDelegate{


var userLocation: CLLocation? = nil
var locationManager:CLLocationManager!


struct LocationStruct{
    var latitude:CLLocationDegrees?, longitude:CLLocationDegrees?
}

var locationStruct = LocationStruct()


func sendLocationPost(){
    determineCurrentLocation()
    print(userLocation) // This is nil
    print(locationStruct.latitude) // This is nil
    print(locationStruct.longitude) // This is nil

}

func determineCurrentLocation(){
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    if CLLocationManager.locationServicesEnabled(){
        locationManager.startUpdatingLocation()
    }
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
    userLocation = locations[0] as CLLocation
    print(userLocation) // This IS NOT nil
    locationStruct.latitude=userLocation?.coordinate.latitude
    locationStruct.longitude=userLocation?.coordinate.longitude

}

Заранее спасибо за помощь, так как знаю, что это будет что-то простое / глупое

1 ответ

Решение

Это просто вопрос понимания того, что вещи требуют времени. Вы продвигаетесь вперед, как будто начало местоположения дает вам местоположение мгновенно. Но это не так:

func sendLocationPost(){
    determineCurrentLocation()
    // so now things start... but they take _time_...!
    print(userLocation) // This is nil
    // because it's _too soon!_
    // ...
}

При первом звонке determineCurrentLocationтребуется много времени, чтобы датчики прогрелись и прибыло в хорошее место:

func determineCurrentLocation(){
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    if CLLocationManager.locationServicesEnabled(){
        locationManager.startUpdatingLocation()
        // SLOWLY... things now start to happen
    }
}

Наконец, через некоторое значительное время, может быть, просто возможно, мы наконец-то начали получать некоторые обновления, и через некоторое время, возможно, они не равны нулю:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
    userLocation = locations[0] as CLLocation
    print(userLocation) // This IS NOT nil
    locationStruct.latitude=userLocation?.coordinate.latitude
    locationStruct.longitude=userLocation?.coordinate.longitude

}

Теперь у нас есть место. Но пока что ваш код в sendLocationPost закончилась давно и получила nil,

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