我有一个应用需要将许多地址转换为CLPlacemark才能获得纬度/经度。 在Apple文档中,它解释说我们不应该执行许多GeoCode请求,地理编码请求是速率限制的。
在我的应用程序中,要执行地理编码,我只需要一个地址,当我得到答案时,我会请求下一个地址,直到我收到所有地址的纬度/经度。
我会将此代码放在专用线程中,以阻止用户。它似乎有效,但这是一个好策略吗?我怎么能确定Apple不会将我的应用程序列入黑名单或为我的请求返回错误。
geoCodingFor(myAddress, index: 0)
private func geoCodingFor(contacts:[String], index:Int) {
if index < contacts.count {
let address = contacts[index]
CLGeocoder().geocodeAddressString(address) { placemarks, error in
if let theError = error {
print("\(#function) geocode has failed for address \(address) with error \(theError .localizedDescription)")
} else {
if let thePlacemark = placemarks {
if thePlacemark.count > 0 {
print("=> Found placemark for address \(address)")
} else {
print("No placemark for address \(address)")
}
} else {
print("\(#function) Warning geocode has no results for address \(address)")
}
}
if index < contacts.count {
self.geoCodingFor(contacts, index: index + 1)
}
}
} else {
print("\(#function) ================> Geocoding is completed")
}
}
答案 0 :(得分:0)
简短:或许只需在每次地理编码请求之前尝试sleep(2)
。
长:虽然人们无法确定苹果是否会将其应用列入“黑名单”。我不确定“黑名单”应用程序是否存在很多地理编码。
我自己也尝试过类似的策略。仅使用外部变量queue
并执行queue.popLast()
。这样做给了我100个结果,然后我开始收到其余地址的错误。
我在每个地理编码请求之前添加了sleep(2)
,我设法提取了超过4000个没有阻止的地理编码。
缺点是 - 需要更多时间。根据您计划进行地理编码的地址数量,这可能很有用。
另请注意,我从未尝试sleep(1)
,这也可以在某种程度上发挥作用。
根据Apple的docs'最高费率'未指定,他们建议
您不应每分钟发送多个地理编码请求
我希望这会有所帮助。
干杯。