使用CLGeocoder反复进行地理编码后出现kCLErrorDomain错误2。

39

我在我的应用程序中有一个搜索栏,用户可以在其中输入地址,并得到地理编码结果。根据以下代码,当用户输入时,结果会随之更新:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    ...
    if (self.geocoder.geocoding) [self.geocoder cancelGeocode];
    [self.geocoder geocodeAddressString:searchText completionHandler:^(NSArray *placemarks, NSError *error) {
        if (error != nil) {
            NSLog(@"ERROR during geocode: %@", error.description);
            return;
        }
        //update the view
    }];
}

这适用于用户在搜索字段中输入的前几个字符。然而,当用户重复输入更多字符后,地理编码器开始出现以下错误(我知道这意味着网络存在问题):

ERROR during geocode: Error Domain=kCLErrorDomain Code=2 "The operation couldn’t be completed. (kCLErrorDomain error 2.)"

地理编码器在整个视图控制器重新加载之前无法正常工作。为什么会发生这种情况,我该如何解决?
4个回答

71
我认为原因如下:
苹果的地理编码器并不会以相同的方式回应每个请求。相反,来自特定设备的第一个请求会迅速得到回应,但如果该设备发送了100个或更多请求,则回应时间将越来越慢或根本不回答,这可能会导致您的错误。
当重新加载视图控制器时,这只是需要时间,而地理编码服务器更愿意再次回答。
实质上,由于地理编码器服务器希望保护自己免受来自单个设备的请求过载,因此您无法做任何事情。您只需限制发送到那里的请求数量即可。
顺便说一下:文档指出,“您不应每分钟发送超过一个地理编码请求”。

哦,是的,我没有注意到文档中的那一行。很有道理。 - jburns20
2
真希望在开发过程中有一两周的宽限期:( - Gabriel Jensen
你可以在这个错误后等待几秒钟,然后再尝试一次,它就可以完美地工作了。 - Kode
如何添加延迟? - user6539552
好的,我是7年前做的,也许服务器特性从那时起就已经改变了。但我记得最初的30个(左右)请求被很快地回答了,但之后你必须等待一段时间(也许20秒?)才能成功回答下一个请求。我想你只需要试一试就可以了。 - Reinhard Männer
显示剩余2条评论

5
请注意,设备离线时也会返回相同的错误。

1
这就是我对这个错误的全部了解,当在线出现问题时,它让我感到非常困扰 :/ - user5306470

2

在为聊天应用程序选择位置时,我遇到了这个问题。 我的解决方案是在用户停止拖动地图之后引入3秒的延迟,然后再进行地理编码调用,以确保用户确实要选定该位置。


0

我使用了3个委托方法:

func mapView(_ mapView: GMSMapView, willMove gesture: Bool)

func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition)

func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition)

在每个方法中,我都调用了反向地理编码API。结果触发了错误信息。

这个错误主要是因为您多次频繁地请求反向地理编码API。

怎么解决呢?

-> 当您即将开始拖动时,第一个委托方法会触发

-> 当您拖动视图时,相机位置正在改变,因此第二个委托方法被触发并请求地理编码API

-> 当相机静止时,第三个委托方法被触发。

对于我的情况,我需要在标签中显示位置数据,就像Uber在地图上设置的那样,并且我分析出实际上只有当相机位置静止时才需要数据。例如,如果我想获取10公里距离的位置数据,我需要中间9公里的数据吗?

所以我从第一个和第二个委托方法中删除了地理位置调用,只保留在第三个委托方法中。当委托方法被触发时,我在标签中设置了Loading..

在后台线程中获取数据,因为我不想为此挂起主线程。

还在获取之前保持了1秒的延迟,只是为了在这两个API调用之间保持分离。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接