Я очень много нового для GCD. У меня есть эта функция для прямого геокодирования, и проблема в том, что она возвращается до завершения завершения завершения. Поэтому каждый раз, когда он просто возвращает , ноль. Я узнал, что могу использовать семафоры, чтобы возврат ожидал завершения закрытия, но примеров в Интернете мало, и я не нашел ни одной из возвращаемых функций. Я попытался реализовать его, но функция по-прежнему возвращает nil, хотя местоположение распечатывается на консоль через несколько секунд. Если бы кто-то мог сказать мне, где я ошибаюсь, я был бы очень благодарен.GCD Semaphore не ждет (Swift)
func forwardGeocoding(address: String) -> CLLocation? {
var userLocation: CLLocation?
var returnvalue: CLLocation?
let semaphore = dispatch_semaphore_create(0)
CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in
if error != nil {
print("Geocoding error: \(error)")
return
}
if placemarks?.count > 0 {
let placemark = placemarks?.first
let location = placemark?.location
let coordinate = location?.coordinate
print("Settings location: \(coordinate!.latitude), \(coordinate!.longitude)")
if let unwrappedCoordinate = coordinate {
let CLReadyLocation: CLLocation = CLLocation(latitude: unwrappedCoordinate.latitude, longitude: unwrappedCoordinate.longitude)
userLocation = CLReadyLocation
dispatch_semaphore_signal(semaphore)
}
}
})
let wait = dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
if wait != 0 {
returnvalue = userLocation
}
return returnvalue
}
Вы собираетесь об этом неправильном пути. Вы должны передать закрытие 'forwardGeocoding' и вызывать это из обработчика завершения, а не пытаться вернуть значение. Ваш текущий подход может блокировать основную очередь, особенно если вы не сигнализируете о семафоре во всех случаях в обработчике завершения. – Paulw11