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
,