2017-10-12 144 views
0

我在嘗試調用iOS MapKit中的.calculate函數時遇到問題。我知道這個函數運行在與我的主線程不同的線程上,但我不知道如何在將控制權返回給主線程之前更新walkingTime的值。Swift異步功能滯後

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

假設計算足夠短,它可能是罰款,只是窩他們:

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 
     } 
    } 
} 

請注意,你的設計,你應該可能使self.initialWalkingTimeself.finalWalkingTime自選因爲它是一個失敗,能處理。

+0

我認爲問題更多的是'.calculate'比'calculateWalkingTime'函數花費更多的時間,所以當控制回到'setupRoutes'函數時,它將'initialWalkingTime'和'finalWalkingTime'設置爲'nil'而不是我的期望值。 –

+0

這不是如何工作的......你的'setupRoutes'函數將在'calculateWalkingTime'的完成塊被調用之前完成。 – PeejWeej

+0

我想我的問題是如何在'setupRoutes'完成之前獲得'calculateWalkingTime'的值保存到'initialWalkingTime'和'finalWalkingTime'中。 –