Я написал класс UserLocation (ниже), в котором используется CoreLocation, чтобы получить текущее место (строка) пользователя & широта и долгота (также строка «lat, long» для переход к API).Принудительный код для ожидания создания объекта перед продолжением
Мой код ниже работает, но когда я инициализирую класс, остальная часть моего кода не дожидается завершения init до перехода, поэтому я упускаю возможность назначить значения, связанные с местоположением, которые я пытаясь получить.
Является ли это разумным подходом (или я должен думать о какой-то другой организации «MVC»), и если да, то как я могу заставить мой код ждать инициализации (с обнаружением местоположения & обратного геокодирования), чтобы закончить прежде чем двигаться дальше. Есть ли способ поставить код ниже инициализации в какое-то закрытие @escaping, указанное в init класса? Я новичок в быстрой, спасибо за ваши добрые советы.
В viewDidAppear ViewController.swift (в):
let userLocation = UserLocation() // initializes properly but code below doesn't wait.
locationsArray[0].name = userLocation.place
locationsArray[0].coordinates = userLocation.coordinates
И мой UserLocation.swift класс:
import Foundation
import CoreLocation
class UserLocation {
var place = ""
var coordinates = ""
let locationManager = CLLocationManager()
var currentLocation: CLLocation!
init() {
returnResults()
}
func returnResults() {
getUserLocation { placemark in
if placemark != nil {
self.place = (placemark?.name)!
self.coordinates = "\((placemark?.location?.coordinate.latitude)!),\((placemark?.location?.coordinate.longitude)!)"
} else {
print("Error retrieving placemark")
}
}
}
func getUserLocation(completion: @escaping (CLPlacemark?) ->()) {
var placemark: CLPlacemark?
locationManager.requestWhenInUseAuthorization()
if (CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse ||
CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways) {
currentLocation = locationManager.location
let geoCoder = CLGeocoder()
geoCoder.reverseGeocodeLocation(currentLocation) { (placemarks, error) -> Void in
if error != nil {
print("Error getting location: \(error)")
placemark = nil
} else {
placemark = placemarks?.first
}
completion(placemark)
}
}
}
}
extension CLPlacemark {
var cityState: String {
var result = ""
switch (self.locality, self.administrativeArea, self.country) {
case (.some, .some, .some("United States")):
result = "\(locality!), \(administrativeArea!)"
case (.some, _ , .some):
result = "\(locality!), \(country!)"
default:
result = name ?? "Location Unknown"
}
return result
}
}
Огромное спасибо - именно то, что мне было нужно. Очень четкое объяснение синтаксиса. Очень признателен! – Gallaugher
@ Gallaugher рад, что я могу помочь – Cristik