MKDirections calculateWithCompletionHandler

问题描述:

我试图让一个函数内的MKDirections请求,然后返回该值。MKDirections calculateWithCompletionHandler

这是我迄今为止

func requestETA(userCLLocation: CLLocation, coordinate: CLLocationCoordinate2D) -> String { 
    let request = MKDirectionsRequest() 

    // code setting up directions request, not important or relevant 

    let directions = MKDirections(request: request) 

    var travelTime = "Not Available" 

     directions.calculate { response, error in 
      if let route = response?.routes.first { 
       travelTime = "\(route.expectedTravelTime/60)" 
       print(travelTime) 
      } else { 
       travelTime = "0" 
      } 
     } 
    print(travelTime) 
    return travelTime 
} 

我知道MKDirections异步运行,因此目前这个返回路线请求完成之前。 如何让return语句等待某种完成处理程序?

也意识到这个问题已经在这里以非常一般的方式隐约地回答了这个stackoverflow。我一直无法弄清楚如何将这个答案应用于这个特定的问题。

您可以添加一个完成处理程序通过一个可选的字符串和错误如下:

func requestETA(userCLLocation: CLLocation, coordinate: CLLocationCoordinate2D, completion: @escaping (_ string: String?, _ error: Error?) ->()) { 
    let request = MKDirectionsRequest() 
    // code setting up directions request 
    let directions = MKDirections(request: request) 
    var travelTime: String? 
    directions.calculate { response, error in 
     if let route = response?.routes.first { 
      travelTime = String(route.expectedTravelTime/60) 
     } 
     completion(travelTime, error) 
    } 
} 

使用

requestETA(userCLLocation: location, coordinate: coordinate) { (travelTime, error) in 
    guard let travelTime = travelTime, error == nil else { return } 
    print(travelTime) 
} 
+0

嗨,狮子座。你是我的救星。对于任何想知道的人,请使用用法闭包来“执行”您计划使用MKDirections结果执行的任何操作。 –