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.initialWalkingTime
和RouteManager.shared.finalWalkingTime
是在我的UI使用的,所以我需要他們離開我calculateWalkingTime
功能之前就被更新。
我該如何去做這件事?
我認爲問題更多的是'.calculate'比'calculateWalkingTime'函數花費更多的時間,所以當控制回到'setupRoutes'函數時,它將'initialWalkingTime'和'finalWalkingTime'設置爲'nil'而不是我的期望值。 –
這不是如何工作的......你的'setupRoutes'函數將在'calculateWalkingTime'的完成塊被調用之前完成。 – PeejWeej
我想我的問題是如何在'setupRoutes'完成之前獲得'calculateWalkingTime'的值保存到'initialWalkingTime'和'finalWalkingTime'中。 –