2017-10-28 1 views
0

두 점 사이의 거리와 시간을 계산하는 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]() 

하거나, 코드가 더 표현하기 위해 :

답변

1
var completionHandlers: [() -> Void] = [] 

for i in 1...10 { 

    let handler = { 

     print(i) 

    } 

    completionHandlers.append(handler) 

} 

그 후 당신은 핸들러를 실행할 수 있습니다

let handler = completionHandlers[0] 
handler() 

그리고 핸들러의 모든 통해 이동 :

completionHandlers.forEach { handler in 
    handler() 
} 

주의 : 핸들러를 배열에 저장하면 강력한 참조가됩니다.

let handler = { 
    self.myFunction() 
} 

당신은 자기에 약한 참조를함으로써 retaicnycle을 방지 할 수 있습니다 폐쇄는 폐쇄 내에서 언급하는 모든 것에 강한 참조를 유지하기 때문에 당신이 self를 참조 할 때, 그것은 참조주기를 쉽게 만들 수 있습니다 :

let handler = { [weak self] in 
    self?.myFunction() 
} 
+0

감사합니다. Marcel. 그래서 필자는 기본적으로 계산을 핸들러로 저장하고 있으며, 이것을 completionHandler 배열에 추가합니다. – mathleticolewis

+0

왜 외부에서 계산을 처리하고 싶습니까? 당신은'.calculate {[weak self] response, error in'를 사용하여 자신에 대한 강한 참조를하지 않도록 할 수 있습니다. – Marcel

+0

계산 결과를 다른보기 컨트롤러에 전달하려고합니다. 그래서 이것을 수행하는 가장 좋은 방법은 일련의 결과를 만든 다음 각 세그먼트를 통과시키는 것입니다. – mathleticolewis

관련 문제