我有一个CLLocationCoordinates2D
数组,并设置了一个for循环来调用函数get_addres_from_geoCoder
,但此函数仅打印一个地址,而CLLocationCoordinates2D数组具有18个值(纬度,长整数)
override func viewDidLoad() {
super.viewDidLoad()
for a in My_rides_Pick_locatio
{
let loc = CLLocationCoordinate2D(latitude:a.latitude,longitude: a.longitude)
self.get_addres_from_geoCoder(loc: loc)
}
func get_addres_from_geoCoder(loc : CLLocationCoordinate2D) {
let location: CLLocation = CLLocation(latitude: loc.latitude, longitude: loc.longitude)
geo.reverseGeocodeLocation(location as CLLocation, preferredLocale: nil) { (clPlacemark: [CLPlacemark]?, error: Error?) in
guard let place = clPlacemark?.first else {
print("No placemark from Apple: \(String(describing: error))")
return
}
print("----")
print(place.compactAddress!)
}
}
}
结果
巴基斯坦拉瓦尔品第市集市路
这是Apple的限制。请参阅文档。
讨论此方法将指定的位置数据异步提交到地理编码服务器并返回。请求完成后,地理编码器将在主线程上执行提供的完成处理程序。
发起反向地理编码请求后,请勿尝试发起另一个反向地理编码或正向地理编码请求。地理编码请求受每个应用程序的速率限制,因此在短时间内提出过多请求可能会导致某些请求失败。当超出最大速率时,地理编码器会将值CLError.Code.network的错误对象传递给完成处理程序。
克里斯在上一个答案中是正确的,您不应该对带有大量请求的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)
}
}
number参数和prints语句就在其中,因此您可以轻松查看正在发生的情况,需要将其从任何最终代码库中删除。
就像一个简单的演示如何使用它,下面有一个示例。我已经在测试中成功处理了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)