CLGeocoder 只返回第一个查找结果

Posted

技术标签:

【中文标题】CLGeocoder 只返回第一个查找结果【英文标题】:CLGeocoder only returns first look up result 【发布时间】:2014-04-30 21:19:00 【问题描述】:

- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler; 遇到一个奇怪的问题。

我有一个需要查找的位置列表。所以我做了类似的事情

for (Trip *trip in takenTrips) 
    [geoCoder geocodeAddressString:trip.location completionHandler:^(NSArray *placemarks, NSError *error) 
        //handling result
    ];

但完成处理程序似乎只被调用一次。我尝试按顺序进行这些查找。然后一切正常。

我搜索了一段时间,但找不到类似的东西。我在这里完全感到困惑......

欢迎提出任何建议!

【问题讨论】:

【参考方案1】:

应用程序应该意识到它们如何使用地理编码。有效使用此类的经验法则:对于任何一个用户操作,最多发送一个地理编码请求。 class link

要解决您的问题,您可以选择以下方法之一:

    Do-while 循环检查地理编码器是否正在处理地理编码 NSOperationQueue 在完成后一次执行一个 在 completeHandle 中执行一个回调来运行下一个地理编码

【讨论】:

哦,我不知道。那我就按顺序做吧。【参考方案2】:

你为什么不用更多的geocoder

dispatch_queue_t geocoderQueue = dispatch_queue_create("geocoder.queue", DISPATCH_QUEUE_CONCURRENT); 
dispatch_apply([takenTrips count], dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ull), ^(size_t index) 

    NSString *loc = [(Trip *)takenTrips[index] location];

    CLGeocoder *geoCoder = [CLGeocoder new];
    [geoCoder geocodeAddressString:loc completionHandler:^(NSArray *placemarks, NSError *error) 
        CLPlacemark *placemark = [placemarks firstObject];
        NSLog(@"%@",placemark.postalCode);
    ];
);

还可以在私有并发队列中,这样您就可以获得很好的性能结果。

【讨论】:

以上是关于CLGeocoder 只返回第一个查找结果的主要内容,如果未能解决你的问题,请参考以下文章

无法从 CLGeocoder reverseGeocodeLocation 返回字符串

地图上的多个位置(使用MKMapItem和CLGeocoder)

通过 CLGeocoder 的方法查找一个区域中的所有位置

在 iOS 中使用 CLGeocoder 进行转发地理编码,为某些位置的位置返回 null

使用 CLGeocoder 反向地理编码查找当前位置

CLGeocoder 转发地理编码邮政编码