我有一个坐标数组,可以通过for循环逐步执行。我想在每个位置的 map 上放置注释,并使用reverseGeocodeLocation
找到标注的字幕作为坐标的地址。在for循环中,我调用reverseGeocodeLocation
方法,并在完成代码块中创建注释并显示在 map 上但是,当我运行该应用程序时,仅显示一个注释。我进入调试器,并且完成块仅被调用一次(对于reverseGeocodeLocation
方法的两次调用)。有什么建议可以解决这个问题吗?
我的for循环:
for(int i = 0; i < [locations count]; i++)
{
CLLocation *location = [locations objectAtIndex:i];
__block NSString *info;
NSLog(@"Resolving the Address");
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error)
{
NSLog(@"Found placemarks: %@, error: %@", placemarks, error);
if (error == nil && [placemarks count] > 0)
{
placemark = [placemarks lastObject];
info = [NSString stringWithFormat:@"%@ %@ %@ %@, %@",
placemark.subThoroughfare, placemark.thoroughfare,
placemark.postalCode, placemark.locality,
placemark.administrativeArea];
[self remainderOfMethod:location withAddress:info atIndex:i];
}
else
{
NSLog(@"%@", error.debugDescription);
}
} ];
}
然后在完成块中调用的方法:
- (void) remainderOfMethod: (CLLocation *)location withAddress:(NSString *)info atIndex: (int)i
{
MKPointAnnotation* annotation = [[MKPointAnnotation alloc] init];
if (location != nil)
{
[annotation setSubtitle:[NSString stringWithFormat:@"%@", info]];
annotation.coordinate = location.coordinate;
[self.mapView addAnnotation:annotation];
}
}
谢谢!
最佳答案
从苹果官方文档中:
发起反向地理编码请求后,请勿尝试执行以下操作
发起另一个反向或正向地理编码请求
您可以在这里找到文档:https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLGeocoder_class/Reference/Reference.html#//apple_ref/occ/instm/CLGeocoder/reverseGeocodeLocation:completionHandler:
解决该问题的一种方法是,在每次迭代中从堆栈(或数组)中弹出一个位置的递归方法中,一次只执行一个请求。
即使在这种情况下,请考虑苹果公司对此有何评论:
地理编码请求受每个应用程序的速率限制,因此产生了太多请求
短时间内的请求可能会导致某些请求
失败
因此,您可能需要按需请求地理编码,例如,当用户点击注释时。
关于ios - reverseGeocodeLocation仅执行一次完成块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23072591/