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.initialWalkingTime
とRouteManager.shared.finalWalkingTime
は私のUIで使用されているので、私は彼らが私のcalculateWalkingTime
機能を去る前に、それらを更新する必要があります。
これを行うにはどうすればよいですか?
私は、 '.calculate'は' calculateWalkingTime'関数よりも時間がかかるので、 'setupRoutes'関数に戻ってくると、' initialWalkingTime'と 'finalWalkingTime'をmyではなく' nil'に設定します所望の値。 –
これはどのように動作しますか? 'setupRoutes'関数は' calculateWalkingTime'の完了ブロックが呼び出される前に終了します。 – PeejWeej
私は 'setWalkingTime'に' calculateWalkingTime'を、 'setupRoutes'を完了する前に' finalWalkingTime'に 'calculateWalkingTime'の値をどのようにして保存すればよいのでしょうかと思います。 –