2016-01-29 2 views
1

Я пытаюсь вычислить ETA между двумя координатами в Swift, используя calculateETAWithCompletionHandler из класса MKDirections. У меня есть следующий код в моей программе,MKDirections calculateETAWithCompletionHandler выполняется с задержкой Swift 2.0

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") 
} 

Я включал операторы печати, чтобы показать выполнение кода. Когда я запускаю программу, выход я получаю

A 
C 
D 
G 
B 
E 
F 

Итак, я заметил, что функция calculateETAofClosestBus() заканчивает выполнение (достигает G, то B), а затем directions.calculateETAWithCompletionHandler исполняет, так 'E' и 'F' распечатаны ПОСЛЕ мы вернулись из расчетаETAofClosestBus().

Я уверен, что не понимаю, как вычисляется функцияETAWithCompletionHandler, но я бы хотел рассчитать ETA между двумя аннотациями через автомобиль, и если есть более интуитивный способ выполнить это или кто-то может помочь мне понять Обработчик лучше, это было бы очень признательно.

Решение:

iOS - Swift - Function that returns asynchronously retrieved value помог мне понять, как это сделать лучше всего.

ответ

0

Пожалуйста, посмотрите ATH этого Link ясно говорится calculateETAWithCompletionHandler работает асинхронно .Since асинхронными, он работает на разных thread.But основного потока выполняется по-своему и печатает G

начинает вычисления запросила информацию о времени поездки асинхронно.

Если вы хотите вернуться в асинхронном method..You можно сделать с помощью closure.Here является link

+0

Благодарим Вас за направление. – Ivan

+0

без проблем :) .... –

Смежные вопросы