Iphone 使用CLGeocoder重复地理编码后出现kCLErrorDomain错误2

Iphone 使用CLGeocoder重复地理编码后出现kCLErrorDomain错误2,iphone,ios,mapkit,core-location,clgeocoder,Iphone,Ios,Mapkit,Core Location,Clgeocoder,我在我的应用程序中有一个搜索栏,用户可以在其中键入地址,搜索栏将显示地理编码的结果。结果将根据以下代码随用户类型更新: - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { ... if (self.geocoder.geocoding) [self.geocoder cancelGeocode]; [self.geocoder geocodeAddressStr

我在我的应用程序中有一个搜索栏,用户可以在其中键入地址,搜索栏将显示地理编码的结果。结果将根据以下代码随用户类型更新:

- (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
    }];
}
这适用于用户在搜索字段中输入的前几个字符。但是,在用户重复输入更多字符后,地理编码器开始给出以下错误(我知道这意味着网络有问题):


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

我相信原因如下:
苹果的地理编码器并不是以同样的方式回答每一个请求。相反,来自某个设备的第一个请求会很快得到响应,但如果该设备发送了100个或更多请求,则响应速度会越来越慢,或者请求根本没有得到响应,这可能会导致您的错误。
当您重新加载视图控制器时,这只需要时间,地理编码服务器更愿意再次响应。 基本上,您对此无能为力,因为geocoder服务器想要保护自己不被来自单个设备的请求过载。您只需限制发送到那里的请求数量。

顺便说一句:“你不应该每分钟发送超过一个地理编码请求。”我在为messenger应用程序选择位置时遇到了这个问题。
我的解决方案是在用户停止平移地图之后,在地理编码器调用之前引入3秒的延迟。以确保用户完全需要该位置

请注意,当设备脱机时会返回相同的错误。

我使用了3种委托方法

func地图视图(地图视图:GMSMapView,willMove手势:Bool)

func地图视图(地图视图:GMSMapView,didChange位置:GMSCameraPosition)

func映射视图(映射视图:GMSMapView,空闲位置:GMSCAMERAPOSION)

我在每个方法中调用反向地理定位API。我收到了错误信息

该错误主要是因为您多次且更频繁地请求反向地理定位API

怎么做

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

->当我拖动视图时,摄影机正在更改,因此第二个委托方法正在启动并请求地理定位API

->当相机处于空闲状态时,将触发第三个委托方法

在我的例子中,我必须在标签中显示位置数据,比如地图上设置的
Uber
,我分析了当相机位置空闲时我实际需要的数据。就像我想得到10公里距离的数据一样,我需要中间9公里的数据吗

因此,我从第一个和第二个委托方法中删除了geolocation调用,只保留在第三个委托方法中。当委托方法被激发时,我正在标签中设置
加载..

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


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

哦,是的,我没有注意到文档中的那一行。很有道理。当然希望在开发过程中有一两周的宽限期:(实际上,您可以在此错误后等待几秒钟,然后再试一次,效果非常好。您需要等待多久,直到此错误消失?我的测试设备已经返回此错误好几天了。对不起,我不记得了。我记得的是,我可以非常快地发送大约30个请求,并立即收到答复。)y、 在此之前,响应停止了一段时间。但它只停止了大约半分钟。可能服务器平均强制执行此1/s…这就是我所知道的关于此错误的所有信息,并且在联机时获得此错误让我非常失望:/
ERROR during geocode: Error Domain=kCLErrorDomain Code=2 "The operation couldn’t be completed. (kCLErrorDomain error 2.)"