MKDirections CalculateWithCompletionHandler
Я пытаюсь сделать запрос MKDirections внутри функции, а затем вернуть это значение.
Это то, что я до сих пор
func requestETA(userCLLocation: CLLocation, coordinate: CLLocationCoordinate2D) -> String {
let request = MKDirectionsRequest()
// code setting up directions request, not important or relevant
let directions = MKDirections(request: request)
var travelTime = "Not Available"
directions.calculate { response, error in
if let route = response?.routes.first {
travelTime = "\(route.expectedTravelTime/60)"
print(travelTime)
} else {
travelTime = "0"
}
}
print(travelTime)
return travelTime
}
Мне известно, что MKDirections работает асинхронно, и в настоящее время он возвращается до завершения запроса направлений. Как заставить оператор return ждать какой-нибудь обработчик завершения?
Также известно, что на этот вопрос довольно неопределенно дан ответ здесь stackru. Я не смог понять, как применить этот ответ к этой конкретной проблеме.
1 ответ
Решение
Вы можете добавить обработчик завершения для передачи необязательной строки и ошибки следующим образом:
func requestETA(userCLLocation: CLLocation, coordinate: CLLocationCoordinate2D, completion: @escaping (_ string: String?, _ error: Error?) -> () ) {
let request = MKDirectionsRequest()
// code setting up directions request
let directions = MKDirections(request: request)
var travelTime: String?
directions.calculate { response, error in
if let route = response?.routes.first {
travelTime = String(route.expectedTravelTime/60)
}
completion(travelTime, error)
}
}
использование
requestETA(userCLLocation: location, coordinate: coordinate) { (travelTime, error) in
guard let travelTime = travelTime, error == nil else { return }
print(travelTime)
}