私は、複数の場所に対して同時に逆ジオコーディングを実行しようとしています。そこで私は関数performReverseGeoLocation
を作成します。問題は、CLGeocoder().reverseGeocodeLocation
閉鎖以来、completionHandlerLocations
が最初に実行されることです。 forループ内のCLGeocoder().reverseGeocodeLocation
がすべて完了した後に、呼び出し元が補完ハンドラを取得するように、これらの関数をどのように変更しますか?私が試してみましたswift - タスクの完了方法
コード:
private func getImageLocation() {
performReverseGeoLocation(completionHandlerLocations: { (cities, countries) in
print("***** This is executed before the reverse geo code location is done")
})
}
private func performReverseGeoLocation(completionHandlerLocations: @escaping (_ cities: [String], _ countries: [String]) -> Void) {
var cities = [String]()
var countries = [String]()
for image in self.images {
let longitude = image.longitude
let latitude = image.latitude
let location = CLLocation(latitude: latitude, longitude: longitude)
CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in
print("***** This is executed after completionHandlerLocations is done")
if error != nil {
self.alertError("Reverse geocoder failed with error" + (error?.localizedDescription)!)
return
}
if placemarks!.count > 0 {
let pm = placemarks![0]
let country = pm.country
let city = pm.locality
if (!cities.contains(city!)) {
cities.append(city!)
}
if (!countries.contains(country!)) {
countries.append(country!)
}
}
else {
self.alertError("Fail to perform reverse geo location")
}
})
}
// THIS IS WILL EXECUTED FIRST
completionHandlerLocations(cities, countries)
}
一つの可能な解決策は、ディスパッチグループを作成することです、それぞれを持っています内部ブロックはディスパッチグループに入り、離れると、最終的なcompletionHandlerLocations()を呼び出します。例:http://jordansmith.io/dispatch-groups-in-swift-3/ –
ありがとう@i_am_jorf。できます。 – nsutanto