使用CLGeocoder重复地理编码后,kCLErrorDomain错误2

时间:2013-07-25 19:47:35

标签: iphone ios mapkit core-location clgeocoder

我的应用程序中有一个搜索栏,用户可以输入一个地址,然后会出现地理编码结果。根据以下代码,结果将根据用户类型进行更新:

- (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.)"

在重新加载整个ViewController之前,地理编码器不会再次运行。为什么会发生这种情况,我该怎么做才能解决它?

4 个答案:

答案 0 :(得分:53)

我认为原因如下:
Apple的地理编码器不会以相同的方式回答每个请求。相反,来自某个设备的第一个请求会被快速应答,但如果设备发送了100个或更多请求,则答案会越来越慢或者请求根本没有得到应答,这可能会导致您的错误。
当您重新加载视图控制器时,这只需要时间,地理编码服务器更愿意再次回答。 从本质上讲,您无法对此做任何事情,因为地理编码器服务器希望保护自己免受来自单个设备的请求的过载。您只需限制您在那里发送的请求数量 顺便说一句:docs说“你不应该每分钟发送多个地理编码请求”。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

我在为Messenger应用程序选择位置时遇到了这个问题。 我的解决方案是在用户停止平移地图之后,在地理编码器呼叫之前引入3秒的延迟。确保用户完全想要该位置。

答案 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,并且我分析了当相机位置空闲时我实际上需要这些数据。比如我想得到10KM距离的地方的数据,我需要中间9KM的数据吗?

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

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

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