如何一次对一组200个地址进行地理编码

时间:2013-03-21 12:33:29

标签: ios iphone throttling clgeocoder

我已经读过iOS将应用程序限制为一次约50个地理编码请求。如果我有大套装,可能200套怎么办?有什么办法可以一次对超过50套进行地理编码吗?例如,使用集合之间的延迟,每个集合限制为50.什么是延迟集合之间地理编码的理想方法?

我见过NSProgrammer对以下问题的回答:

iPhone iOS5 CLGeocoder how to geocode a large (200) set of addresses?

他提到的那种延迟的任何建议?那个延迟会在处理程序内并在另一个线程上运行吗?

for(int i = 0; i < [myArray count]; i++){

[call geoCoderMethod];
}


-geoCoderMethod{
    [geocoder geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *error) {

    getCo-ordinates;
    add annotation to mapview;
}

我尝试将数组拆分为每个包含25个项目的块并调用geoCoderMethod并使用performSelector方法引发延迟。但performSelector方法和geoCoder似乎在不同的线程中运行,我无法在方法调用之间造成延迟。

2 个答案:

答案 0 :(得分:0)

这里完整的解决方案取决于您的逻辑。您可以使用可变数组来存储所有200个地址并运行“for循环”以限制发送请求少于50,如20或30取决于您的地址数组的数组计数。如果你有200个地址,则除以你的限制来决定这个“for循环”循环的次数,然后如果你除以20,那么你的“for循环”总共运行10次,每次运行它将发送20个地址进行地理编码。这样它就不会达到50而且很容易找到。

答案 1 :(得分:0)

我有一组地址,我需要将它们转换为坐标。我所做的是将收藏分成最多40个联系人(你可能会达到50,但不会超过一分钟)。因此,拥有超过40个联系人的组必须在两者之间有延迟,以便在mapview加载之前处理所有地址并将其转换为坐标。

我需要根据用户要求加载mapview。在我的情况下,无论时间因素如何,都可以再次加载mapview并获得,无论组中的联系人列表如何。 如果用户打算加载mapview并在1分钟内重新加载它,我需要为此开发一个逻辑。为此,我决定保存mapview的状态,如果用户决定在1分钟内重新加载同一组地址。

但是如果用户决定加载另一组联系人,那么我必须根据要加载的联系人组重新考虑我的逻辑。因此,我必须跟踪要加载的组(前一组或新组),组是否有超过40的联系人数。

我需要照顾的另一个重要因素是时间。为此,我有一个静态NSDate变量,它始终跟踪CLGeocoder最后一次工作时的“时间”,以及当前时间(CLGeocoder即将到来的时间)使用)没有1分钟的差异,然后我不得不延迟加载地图。

这是我使用来自CLGeocoder的坐标实现mapView的方法。我确信逻辑可以在很大程度上得到优化,输出会更快。 如果有人提出更好的实施,我们将不胜感激。