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)