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 является ссылкой

Другие вопросы по тегам