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

时间:2016-04-14 09:35:52

标签: ios swift geocoding

我有一个应用需要将许多地址转换为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")
    }
}

1 个答案:

答案 0 :(得分:0)

简短:或许只需在每次地理编码请求之前尝试sleep(2)

长:虽然人们无法确定苹果是否会将其应用列入“黑名单”。我不确定“黑名单”应用程序是否存在很多地理编码。

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

我在每个地理编码请求之前添加了sleep(2),我设法提取了超过4000个没有阻止的地理编码。

缺点是 - 需要更多时间。根据您计划进行地理编码的地址数量,这可能很有用。

另请注意,我从未尝试sleep(1),这也可以在某种程度上发挥作用。

根据Apple的docs'最高费率'未指定,他们建议

  

您不应每分钟发送多个地理编码请求

我希望这会有所帮助。

干杯。