我有一个自定义Item
类型的数组。该模型的位置和目的地属性类型为CLLocation
[获取此项目后,我想使用Geocoder
发出两个请求以获取目的地和位置的CLPlacemark
。但是奇怪的是我可以打电话给目的地或目的地。如果我同时执行两个请求,则仅第一个触发。秒不触发。如您所见,在第一次调用后,我不是在替换数组中的整个模型,而是在更改属性,所以我认为这不是问题。
for (i, element) in self.categories[index].items.enumerated() {
// either this
self.geocoder.reverseGeocodeLocation(element.location, completionHandler: { (placemarks, error) in
if let error = error {
self.error = error.localizedDescription
} else {
self.categories[index].items[i].locationPlacemark = placemarks?.first
}
})
// or this
self.geocoder.reverseGeocodeLocation(element.destination, completionHandler: { (placemarks, error) in
if let error = error {
self.error = error.localizedDescription
} else {
self.categories[index].items[i].destinationPlacemark = placemarks?.first
}
})
}
您不能提交并行反向地理编码请求-
发起反向地理编码请求后,请勿尝试发起另一个反向地理编码或正向地理编码请求。地理编码请求受每个应用程序的速率限制,因此在短时间内提出过多请求可能会导致某些请求失败。当超出最大速率时,地理编码器会将值CLError.Code.network的错误对象传递给完成处理程序。
对于单个Item
,您可以通过在第一个地理处理程序的完成处理程序中启动第二个地理编码请求来解决此问题,但这不适用于多个项目,因为您将并行提交多个“第一个”请求。
您将需要采用更复杂的方法,例如将操作提交到串行操作队列。