두 점 사이의 거리와 시간을 계산하는 closure가 있지만 closure 외부에서 값의 배열 (방향 및 journeyTimes)을 추출해야합니다.신속 완료 핸들러
나는 완성 처리기가가는 길은 확실하지만, 그것을 구현하는 방법을 너무 확신하지는 못한다.
내 코드 :
VAR의 completionHandlers :() -> 보이드] = []
@IBAction func calculateItinerary(_ sender: Any) {
// start calc
for index in 0...coordsOfCollective.count - 2 {
let sourceLocation = MKPlacemark(coordinate: coordsOfCollective[index])
let destinationLocation = MKPlacemark(coordinate: coordsOfCollective[index + 1])
let sourceMapItem = MKMapItem(placemark: sourceLocation)
let destinationMapItem = MKMapItem(placemark: destinationLocation)
let request = MKDirectionsRequest()
request.source = sourceMapItem
request.destination = destinationMapItem
request.transportType = .automobile
request.requestsAlternateRoutes = false
let directions = MKDirections(request: request)
directions.calculate { response, error in
if let route = response?.routes.first {
print("Distance: \(route.distance/1000) km, ETA: \(route.expectedTravelTime/60) mins")
self.distances.append(route.distance/1000)
self.journeyTimes.append(route.expectedTravelTime/60)
print(self.distances)
print(self.journeyTimes)
completionHandlers.append(?????)
} else {
print("Error!")
}
}
}
print(completionHandlers)
}
directions.calculate 계산할의 선언을 갖는다 : I (completionHandler가 MKDirectionsHandler을 @escaping) 그래서 그것이 탈출구라는 것을 알 수 있습니다. 그러나 거리와 거리를 추출하는 방법을 알지 못합니다. 인쇄 기능은 현재 값을 생산하지만 다른 곳에서는 액세스 할 수 없습니다.
도움을 주시면 감사하겠습니다. 감사.
completionHandlers[0]()
하거나, 코드가 더 표현하기 위해 :
감사합니다. Marcel. 그래서 필자는 기본적으로 계산을 핸들러로 저장하고 있으며, 이것을 completionHandler 배열에 추가합니다. – mathleticolewis
왜 외부에서 계산을 처리하고 싶습니까? 당신은'.calculate {[weak self] response, error in'를 사용하여 자신에 대한 강한 참조를하지 않도록 할 수 있습니다. – Marcel
계산 결과를 다른보기 컨트롤러에 전달하려고합니다. 그래서 이것을 수행하는 가장 좋은 방법은 일련의 결과를 만든 다음 각 세그먼트를 통과시키는 것입니다. – mathleticolewis