reverseGeocodeLocation仅执行一次完成块

时间:2014-04-15 00:22:31

标签: ios objective-c cllocation

我有一个坐标数组,我通过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];
     }
}

谢谢!

1 个答案:

答案 0 :(得分:2)

来自官方Apple文档:

  

启动反向地理编码请求后,请勿尝试   启动另一个反向或前向地理编码请求

您可以在此处找到文档:https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLGeocoder_class/Reference/Reference.html#//apple_ref/occ/instm/CLGeocoder/reverseGeocodeLocation:completionHandler

解决此问题的一种方法是在递归方法中一次只执行一个请求,该方法在每次迭代时从堆栈(或数组)中弹出一个位置。

即使在这种情况下,请考虑Apple对此有何评价:

  

地理编码请求对每个应用都是速率限制的,所以制作太多了   短时间内的请求可能会导致一些请求   失败

因此,您可能希望按需请求地理编码,例如,当用户点按注释时。