iOS前向地理编码返回不稳定,稀疏的结果

时间:2014-08-21 08:56:55

标签: ios uitableview geocoding clgeocoder

我正在开发一个需要能够按名称搜索位置的应用,而且由于CLGeocoder,它似乎应该相当简单。我已经完成了所有设置,它似乎正在工作,但我得到了惊人的稀疏结果。

无论我输入什么,我最多得到1-2个结果,通常都没有。当我搜索“太平洋水族馆”时,它发现它是正确的,但只有当我真正完成输入时:即使只是最后一个字母“c”也没有,它什么都没有。键入我自己的地址不会返回任何内容,即使我完全输入它也是如此。

这是怎么回事?当然CLGeocoder不是没用的吗?我可以做些什么来增加返回结果的数量,或者扩大可能的匹配范围?

以下是我正在使用的代码,连接到简单的UITableViewUISearchBar对......

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    [_placeResults removeAllObjects];
    [_geocoder geocodeAddressString:searchText completionHandler:^(NSArray* placemarks, NSError* error){
        for (CLPlacemark* aPlacemark in placemarks) {
            [_placeResults addObject:aPlacemark];
        }
        [_mainTableView reloadData];
     }];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [_placeResults count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    SearchTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    CLPlacemark *thisPlace = [_placeResults objectAtIndex:indexPath.row];
    [cell.labelTitle setText:[[[thisPlace addressDictionary] objectForKey:@"FormattedAddressLines"] objectAtIndex:0]];

    return cell;
}

正如我所说,它有点工作,所以我知道所有内容都正确连接。它只是不能很好地工作。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我认为你对CLGeocoder的目的有错误的想法。它旨在转换地理位置坐标和它的全文标题。

此外,您是否阅读了文档? CLGeocoder需要联系地理编码服务器。因此,在textDidChange:消息的每次迭代中调用它不仅是一种不正确的用法,而且效率很高。

来自Apple的文档:

  

应用程序应该意识到它们如何使用地理编码。地理编码请求对每个应用程序都是速率限制的,因此在短时间内发出过多请求可能会导致某些请求失败。 (当超过最大速率时,地理编码器会将值为kCLErrorNetwork的错误对象返回到关联的完成处理程序。)以下是有效使用此类的一些经验法则:

     

为任何一个用户操作发送最多一个地理编码请求。

     

如果用户执行涉及对同一位置进行地理编码的多个操作,请重复使用初始地理编码请求的结果,而不是针对每个操作启动单个请求。

这里的想法是,每个应用程序都受Apple限制。因此,您需要谨慎使用API​​,并提交全文查询。

摘录geocodeAddressString:completionHandler:

  

在发起前向地理编码请求后,请勿尝试启动其他正向或反向地理编码请求。