38

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

- (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

4 回答 4

70

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

于 2013-07-25T20:30:48.970 回答
6

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

于 2018-12-25T14:14:08.440 回答
2

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

于 2018-01-18T10:55:11.280 回答
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 调用之间的分离。

于 2021-02-26T17:11:21.533 回答