执行许多地理编码请求的策略
我有一个应用程序需要将许多地址转换为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议
您不应每分钟发送一个以上的地理编码请求
我希望这有帮助。
干杯。