【问题标题】:kCLErrorDomain error 2 after geocoding repeatedly with CLGeocoder使用 CLGeocoder 重复地理编码后的 kCLErrorDomain 错误 2
【发布时间】:2013-07-25 19:47:34
【问题描述】:

我的应用程序中有一个搜索栏,用户可以在其中输入地址,它会提供地理编码结果。根据以下代码,结果会随着用户键入而更新:

- (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 之前,地理编码器不会再次工作。为什么会发生这种情况,我可以做些什么来解决它?

【问题讨论】:

    标签: iphone ios mapkit core-location clgeocoder


    【解决方案1】:

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

    【讨论】:

    • 哦,是的,我没有注意到文档中的那一行。很有道理。
    • 当然希望在开发过程中有一两周的宽限期:(
    • 您实际上可以在出现此错误后等待几秒钟,然后再试一次,它可以正常工作
    • 您需要等待多长时间才能消除此错误?我的测试设备已经返回这个错误好几天了。
    • 对不起,我不记得了。我记得的是,我可以非常快地发送大约 30 个请求,并在响应停止一段时间之前立即收到答复。但它只停了半分钟左右。也许服务器平均强制执行这个 1/sec...
    【解决方案2】:

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

    【讨论】:

    • 这就是我所知道的关于这个错误的全部信息,并且当 online 让我如此糟糕时得到它:/
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我使用了 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 调用之间的分离。

      【讨论】:

        猜你喜欢
        • 2013-07-25
        • 2012-12-03
        • 2012-03-20
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        相关资源
        最近更新 更多