我有一个坐标数组,我通过for循环逐步完成。我想在地图上为每个位置放置注释,并将标注的副标题设置为坐标的地址,使用reverseGeocodeLocation
找到。在for循环中,我调用reverseGeocodeLocation
方法,并且在完成块内,我创建了注释并将其显示在地图上。但是,当我运行应用程序时,只显示一个注释。我进入调试器,完成块只被调用一次(两次调用reverseGeocodeLocation
方法)。有什么建议可以解决这个问题吗?
我的循环:
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];
}
}
谢谢!
答案 0 :(得分:2)
来自官方Apple文档:
启动反向地理编码请求后,请勿尝试 启动另一个反向或前向地理编码请求
解决此问题的一种方法是在递归方法中一次只执行一个请求,该方法在每次迭代时从堆栈(或数组)中弹出一个位置。
即使在这种情况下,请考虑Apple对此有何评价:
地理编码请求对每个应用都是速率限制的,所以制作太多了 短时间内的请求可能会导致一些请求 失败
因此,您可能希望按需请求地理编码,例如,当用户点按注释时。