【发布时间】:2016-01-29 03:33:27
【问题描述】:
我正在尝试使用 MKDirections 类中的 calculateETAWithCompletionHandler 计算 Swift 中两个坐标之间的 ETA。我的程序中有以下代码,
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”AFTER 我们从 calculateETAofClosestBus() 返回。
我确定我不明白 calculateETAWithCompletionHandler 的工作原理,但我想通过汽车计算两个注释之间的 ETA,如果有更直观的方法来完成此操作,或者是否有人可以帮助我理解处理程序更好,那将不胜感激。
解决方案:
iOS - Swift - Function that returns asynchronously retrieved value 帮助我了解了如何最好地完成这项工作。
【问题讨论】:
标签: swift asynchronous closures mkmapview mapkit