MKDirections рассчитывает ETAWithCompletionHandler, выполняющийся с задержкой Swift 2.0
Я пытаюсь вычислить ETA между двумя координатами в Swift, используя calcETAWithCompletionHandler из класса MKDirections. У меня есть следующий код в моей программе,
MapViewController.swift
print("A")
calculateETAofClosestBus(closestBusStop)
print("B")
func calculateETAofClosestBus(destination: BusStop) {
var shortestETA = 0
print("C")
var request = MKDirectionsRequest()
var sourceItem = MKMapItem(placemark: MKPlacemark(coordinate: listBuses[0].pin.coordinate, addressDictionary: nil))
request.source = sourceItem
request.transportType = .Automobile
let destinationCoordinates = CLLocationCoordinate2D(latitude: destination.coordinate.latitude, longitude: destination.coordinate.longitude)
let destinationItem = MKMapItem(placemark: MKPlacemark(coordinate: destinationCoordinates, addressDictionary: nil))
request.destination = destinationItem
request.requestsAlternateRoutes = false
var directions = MKDirections(request: request)
print("D")
directions.calculateETAWithCompletionHandler { (etaResponse, error) -> Void in
print("E")
if let error = error {
print("Error while requesting ETA : \(error.localizedDescription)")
} else {
print("F")
shortestETA = Int((etaResponse?.expectedTravelTime)!)
}
}
print("G")
}
Я включил операторы print, чтобы показать выполнение кода. Когда я запускаю программу, я получаю вывод
A
C
D
G
B
E
F
Итак, я заметил, что функция calcETAofClosestBus() завершает выполнение (достигает G, затем B), но затем directions.calculateETAWithCompletionHandler выполняется, поэтому "E" и "F" печатаются ПОСЛЕ того, как мы вернулись из calcETAofClosestBus().
Я уверен, что не понимаю, как рассчитывается ETAWithCompletionHandler, но я хотел бы рассчитать ETA между двумя аннотациями с помощью автомобиля, и если есть более интуитивный способ сделать это или кто-то может помочь мне лучше понять обработчик, то будет принята с благодарностью.
Решение:
iOS - Swift - функция, которая возвращает асинхронно полученное значение, помогла мне понять, как добиться этого наилучшим образом.
1 ответ
Пожалуйста, посмотрите на эту ссылку, в которой четко говорится calculateETAWithCompletionHandler
работает асинхронно. Так как асинхронный, он работает в другом потоке. Но ваш основной поток выполняется по-своему и печатает G
Начинает вычисление запрошенной информации о времени в пути асинхронно.
Если вы хотите вернуться в асинхронном методе.. Вы можете сделать с помощью closure.Here является ссылкой