2017-10-12 27 views
0

iOS MapKitにある.calculate関数を呼び出す際に問題が発生しています。私はこの関数がメインスレッドとは別のスレッドで動作することを理解していますが、メインスレッドに制御を戻す前にwalkingTimeの値を更新する方法がわかりません。即時非同期機能の遅延

class RouteManager { 

    static let shared = RouteManager() 
    var initialWalkingTime: Double! 
    var finalWalkingTime: Double! 
    private init() { 

    } 

    func calculateWalkingTime(
       from givenLocation: CLLocation, 
       to givenStop: CLLocation, 
       completion: @escaping (_ double: Double?, _ error: Error?) ->()) { 

     let sourcePlacemark = MKPlacemark(coordinate: givenLocation.coordinate) 
     let sourceMapItem = MKMapItem(placemark: sourcePlacemark) 
     let destinationPlacemark = MKPlacemark(coordinate: givenStop.coordinate) 
     let destinationMapItem = MKMapItem(placemark: destinationPlacemark) 
     var walkingTime: Double? 

     let request = MKDirectionsRequest() 
     request.source = sourceMapItem 
     request.destination = destinationMapItem 
     request.transportType = .walking 
     request.requestsAlternateRoutes = false 
     let directions = MKDirections(request: request) 

     directions.calculate { response, error in 
      if let route = response?.routes.first { 
       walkingTime = (route.expectedTravelTime/60) 
      } 
      completion(walkingTime, error) 
     } 
    } 

    func setupRoutes(from initialLocation: CLLocation, to finalLocation: CLLocation) { 

     let startingLocation = BusManager.shared.startingLocation.location 
     let endingLocation = BusManager.shared.endingLocation.location 

     calculateWalkingTime(from: initialLocation, to: startingLocation) {(walkingTime, error) in 
      guard let walkingTime = walkingTime, error == nil else {return} 
      self.initialWalkingTime = walkingTime 
     } 

     calculateWalkingTime(from: endingLocation, to: finalLocation) {(walkingTime, error) in 
      guard let walkingTime = walkingTime, error == nil else {return} 
      self.finalWalkingTime = walkingTime 
     } 
    } 
} 

基本的に私のRouteManager.shared.initialWalkingTimeRouteManager.shared.finalWalkingTimeは私のUIで使用されているので、私は彼らが私のcalculateWalkingTime機能を去る前に、それらを更新する必要があります。

これを行うにはどうすればよいですか?

答えて

0

十分に短い計算を想定すると、それだけで巣それらにおそらく大丈夫です:それは失敗し、可能なプロセスなので、あなたのデザインで、あなたはおそらくself.initialWalkingTimeself.finalWalkingTime optionalsをしなければならないことを

func setupRoutes(from initialLocation: CLLocation, to finalLocation: CLLocation) { 

    let startingLocation = BusManager.shared.startingLocation.location 
    let endingLocation = BusManager.shared.endingLocation.location 

    calculateWalkingTime(from: initialLocation, to: startingLocation) {(firstWalkingTime, error) in 
     guard let firstWalkingTime = firstWalkingTime, error == nil else {return} 

     calculateWalkingTime(from: endingLocation, to: finalLocation) {(secondWalkingTime, error) in 
      guard let secondWalkingTime = secondWalkingTime, error == nil else {return} 
      self.initialWalkingTime = firstWalkingTime 
      self.finalWalkingTime = secondWalkingTime 
     } 
    } 
} 

注意。

+0

私は、 '.calculate'は' calculateWalkingTime'関数よりも時間がかかるので、 'setupRoutes'関数に戻ってくると、' initialWalkingTime'と 'finalWalkingTime'をmyではなく' nil'に設定します所望の値。 –

+0

これはどのように動作しますか? 'setupRoutes'関数は' calculateWalkingTime'の完了ブロックが呼び出される前に終了します。 – PeejWeej

+0

私は 'setWalkingTime'に' calculateWalkingTime'を、 'setupRoutes'を完了する前に' finalWalkingTime'に 'calculateWalkingTime'の値をどのようにして保存すればよいのでしょうかと思います。 –