执行许多地理编码请求的策略

我有一个应用程序需要将许多地址转换为CLPlacemark获取经度/纬度。 在Apple文档中解释说,我们不应该执行许多GeoCode请求,地理编码请求的速率是有限的。

在我的应用程序中,要执行地理编码,我只需要一个地址,当我得到答案时,我会请求下一个地址,直到我收到所有地址的经纬度。

我将把这个代码放在一个专门的线程中,不要阻塞用户。 这似乎工作,但这是一个好策略? 我怎样才能确定苹果不会将我的应用程序黑名单或返回错误的请求。

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") } } 

短:也许只是在每个地理编码请求之前尝试sleep(2)

长:虽然人们不能确定苹果是否会“黑名单”他们的应用程序。 我不确定存在很多“黑名单”地理编码应用程序。

我自己也尝试过类似的策略。 只使用外部variablesqueue并执行queue.popLast() 。 这样做给了我100个结果,然后我开始得到其他地址的错误。

在每个地理编码请求之前,我已经添加了一个sleep(2) ,并且设法提取了超过4000个地理编码,没有阻塞。

缺点是 – 需要更多的时间。 取决于您计划进行地理编码的地址数量,这可能是有用的。

另外请注意,我从来没有尝试sleep(1) ,这也可以在一定程度上起作用。

根据苹果公司的文件 “最高利率”没有指定,他们build议

您不应每分钟发送一个以上的地理编码请求

我希望这有帮助。

干杯。