ルートをリクエストし、hackingwithswift の記事 ( https://www.hackingwithswift.com/example-code/location/how-to-find-directions-using-mkmapview-and-mkdirectionsrequest ) をフォローするのは初めてです。新しいルートを追跡するときに、追跡したばかりのルートの代替ルートを取得します。私の目標は、[CLLocation]
からルートを取得することMKDirection
です。問題は、それを追跡するときに代替ルートを取得することですが、保存されたルート(追跡したばかりのものと同じ)からリクエストするresponse
と、エラーメッセージが表示されてnilが表示されることです:
方向エラー: エラー Domain=MKErrorDomain Code=1 "Indicazioni stradali non disponibili" UserInfo={NSLocalizedFailureReason=Le informazioni sull'itinerario non sono attualmente disponibili., MKErrorGEOError=-12, MKErrorGEOErrorUserInfo={ NSDebugDescription = "mapItem は nil にできません"; }, MKDirectionsErrorCode=3, NSLocalizedDescription=Indicazioni stradali non disponibili}
ルートは同じなので、始発も終点も同じ。ここで私が間違っていることがわかりますか?いつもありがとうございます。
func repositionLocation(route: [CLLocation]) -> [CLLocation] {
var repositioned: [CLLocation] = []
let request = MKDirections.Request()
request.requestsAlternateRoutes = false
request.transportType = .walking
let directions = MKDirections(request: request)
let a = route.first?.coordinate
let b = route.last?.coordinate
print("a is: \(String(describing: a)), b is \(String(describing: b))") // prints correct CLLocationCoordinate2D
request.source = MKMapItem(placemark: MKPlacemark(coordinate: a!))
request.destination = MKMapItem(placemark: MKPlacemark(coordinate: b!))
directions.calculate { [unowned self] response, error in
if let err = error {
print("direction error : \(err)")
}
guard let unwrappedResponse = response else {print("no suggested routes available"); return } // here always returns
guard let coord = unwrappedResponse.routes.first?.steps else {return}
for location in coord {
let point: CLLocation = CLLocation(latitude: location.polyline.coordinate.latitude, longitude: location.polyline.coordinate.longitude)
repositioned.append(point)
}
}
return repositioned
}
アップデート :
問題を絞り込んでいます。リクエストが多すぎて(ただし、1つしか作成していません)、サーバーが応答を停止するか、応答が非同期であるため、実際に有効な応答を取得する前に関数が終了しますTableView から呼び出します。での応答をどのように待ちcellForRow
ますか?
更新 2:
CLLocation
貴重な提案の後、ルートをリクエストして応答を取得しています。そこから、ステップごとに新しいものを作成し、repositioned
完了時に返される配列に追加します。私は実際に新しいCLLocation
がループ内で正しく作成されていることを確認しfor
ていますが、配列のサイズは増加せず、返された配列には入力ルートからの最初の追加のみが含まれます。
関数の新しいバージョンは次のとおりです。
func repositionLocation(route: [CLLocation], completion: @escaping ([CLLocation]) -> Void) {
var pos = 0
var repositioned = [CLLocation]()
repositioned.append(route.first!)
guard route.count > 4 else {print("Reposision Location failed, not enough positions");return}
let request = MKDirections.Request()
request.requestsAlternateRoutes = false
request.transportType = .walking
while pos < route.count - 4 {
let a = repositioned.last!.coordinate
let b = route[pos + 4].coordinate
request.source = MKMapItem(placemark: MKPlacemark(coordinate: a))
request.destination = MKMapItem(placemark: MKPlacemark(coordinate: b))
let directions = MKDirections(request: request)
directions.calculate { [unowned self] response, error in
if let err = error {
print("direction error : \(err)")
}
guard let unwrappedResponse = response else {print("no suggested routes available"); return }
print("Response is: \(unwrappedResponse.debugDescription)")
guard let coord = unwrappedResponse.routes.first?.steps else {print("No coordinates");return}
print("coord is: \(coord)")
for location in coord {
let point: CLLocation = CLLocation(latitude: location.polyline.coordinate.latitude, longitude: location.polyline.coordinate.longitude)
print("point is: \(point)") // prints a correct CLLocation with coordinates
repositioned.append(point)
print("repositioned in for loop is : \(repositioned)") // prints just first appended location CLLocation with coordinates
}
}
print("repositioned in while loop is : \(repositioned)")
pos += 5
}
// last segment.
// let a = repositioned.last?.coordinate
// let b = route.last?.coordinate
//
// request.source = MKMapItem(placemark: MKPlacemark(coordinate: a!))
// request.destination = MKMapItem(placemark: MKPlacemark(coordinate: b!))
//
// let directions = MKDirections(request: request)
//
// directions.calculate { [unowned self] response, error in
// if let err = error {
// print("direction error : \(err)")
// }
// guard let unwrappedResponse = response else {print("no suggested routes available"); return }
// print("Response is: \(unwrappedResponse.debugDescription)")
// guard let coord = unwrappedResponse.routes.first?.steps else {print("No coordinates");return}
// for location in coord {
// let point: CLLocation = CLLocation(latitude: location.polyline.coordinate.latitude, longitude: location.polyline.coordinate.longitude)
// repositioned.append(point)
// }
print("repositioned at completion is : \(repositioned)")
completion(repositioned)
// }
}
コメントアウトされた部分を見ないでくださいwhile
。ループ内で処理される部分を超える入力ルートの最後のビットが処理されます。