Крис прав в предыдущем ответе, что вам не следует «спамить» службу геокодирования Apple с большим количеством запросов, поскольку некоторые из них могут быть отброшены. Однако в этом случае я не уверен, что это именно то, что происходит, как если бы каждый из них потерпел неудачу, вызвал бы ваше защитное предложение (так как обработчик завершения все еще вызывается даже для запросов, которые отброшены в соответствии с документацией), и высообщение об ошибке будет напечатано 17 раз.
Похоже, что служба goecoding даже не примет запрос, если он уже активен. Некоторое краткое тестирование, которое я только что провел (потому что оно относится к одному из моих проектов, и я хотел быть уверен, что я его понял), похоже, подтверждает это, поскольку возвращает только ответ на первую отправленную координату и никогда не возвращает ошибкудля последующих.
Поэтому в вашем сценарии лучше использовать итеративный подход, инициирующий обратное геокодирование оставшихся местоположений в обработчике завершения:
let geo = CLGeocoder()
func reverse(locs: [CLLocation], number: Int = 1){
guard !locs.isEmpty else {
print("All Done")
return
}
geo.reverseGeocodeLocation(locs.first!){ placemarks, error in
print("-------------- \(number) -------------")
if let error = error {
print("Error \(error)")
} else if let placemark = placemarks?.first {
print("place: \(placemark)")
}
reverse(locs: Array(locs.dropFirst()), number: number + 1)
}
}
ЧислоПараметр и операторы print просто включены, чтобы вы могли легко видеть, что происходит, и их нужно будет удалить из любой конечной базы кода.
Так же, как тривиальная демонстрация того, как его использовать, ниже приведен пример. Я успешно обработал массив из 20 мест в тестировании.
let c1 = CLLocation(latitude: 51.5074, longitude: 0.1278)
let c2 = CLLocation(latitude: 52.5074, longitude: -0.1278)
let c3 = CLLocation(latitude: 53.5074, longitude: -0.1378)
let c4 = CLLocation(latitude: 54.5074, longitude: -0.1578)
let c5 = CLLocation(latitude: 55.5074, longitude: -0.1778)
let c = [c1, c2, c3, c4, c5]
reverse(locs: c)