Рекурсивная функция с блоком завершения, которая получает несколько MKDirections - Swift
Я пытаюсь получить массив MKRoute
который содержит несколько маршрутов, начинающихся в одном и том же месте, но каждый из которых имеет свой пункт назначения
Проблема в том, что единственный способ, которым я смог придумать, - это с помощью рекурсивной функции, но я не могу найти ничего о том, как использовать рекурсивные функции с блоками завершения. Поскольку загрузка маршрутов выполняется асинхронно, необходим блок завершения.
Как мне получить следующие функциональные возможности, но с блоками завершения? Функциональность "добавить к возвращению"?
func factorial(of num: Int) -> Int {
if num == 1 {
return 1
} else {
return num * factorial(of:num - 1)
}
}
Вот мой код функции
func getDirections(originCoordinate: CLLocationCoordinate2D, destinationCoordinates: [CLLocationCoordinate2D], completion: @escaping(_ routes:[MKRoute]?, _ error: Error?) -> Void) {
// Origin is the same for each route, what changes is the destination
// A singular origin coordinate with an array of destination coordinates is passed in
// The function would in theory be recursive, returning each route from the origin to each of the destinations.
// Leave function if no more destination coordinates are passed
if destinationCoordinates.count == 0 {return}
// Origin
let originPlacemark = MKPlacemark(coordinate: originCoordinate)
let originItem = MKMapItem(placemark: originPlacemark)
// Destination is made from the first element of the passed in destinationCoordinates array.
let destinationPlacemark = MKPlacemark(coordinate: destinationCoordinates.first!)
let destinationItem = MKMapItem(placemark: destinationPlacemark)
// Direction Request setup
let directionRequest = MKDirections.Request()
directionRequest.source = originItem
directionRequest.transportType = .automobile
directionRequest.destination = destinationItem
let directions = MKDirections(request: directionRequest)
// Calculating directions
// Heart of function
directions.calculate { (response, err) in
// Checking if a response is returned
guard let response = response else {
completion(nil, err)
return
}
// Response is returned
let route = response.routes[0]
let tail = Array.dropFirst(destinationCoordinates)
// Recursive part that I'm not sure how to properly implement
completion([route].append(getDirections(originCoordinate, tail)), nil)
}
// If no response is retrieved, our guard let statement sends us here
}
1 ответ
При использовании функции с обработчиком завершения в рекурсивном вызове необходимо обеспечить закрытие для вызова, а затем вызвать обработчик завершения в этом закрытии.
Вот как ты это сделаешь с factorial
:
func factorial(of num: Int, completion: (Int) -> ()) {
if num == 1 {
completion(1)
} else {
factorial(of: num - 1) { partial in
completion(num * partial)
}
}
}
factorial(of: 8) { result in
print(result)
}
40320