3

我正在为 IOS5 开发 iPhone 应用程序。我目前正在使用位于 CoreLocation 框架内的 CLGeocoder 类。我无法确定完成处理程序块是否在最后、地理编码发生后或同时被调用。

我只知道完成处理程序块是在主线程上运行的。有谁知道完成处理程序块是在地理编码完成时运行还是在地理编码器在另一个线程上执行时完成手头任务的代码?

4

2 回答 2

6

完成处理程序在地理编码器完成地理编码后运行。换句话说,它在地理编码任务完成后运行。它不是为了在地理编码器运行时完成其他任务。

完成处理程序包含地标和错误。如果地理编码成功,您将获得一个地标数组。如果没有,你会得到一个错误。

来自文档的注释:

该方法将指定的位置数据异步提交给地理编码服务器并返回。您的完成处理程序块将在主线程上执行。发起正向地理编码请求后,不要尝试发起另一个正向或反向地理编码请求。

每个应用程序的地理编码请求都有速率限制,因此在短时间内发出过多请求可能会导致某些请求失败。当超过最大速率时,地理编码器会将值为 kCLErrorNetwork 的错误对象传递给您的完成处理程序。

@interface MyGeocoderViewController ()

@property (nonatomic, strong) CLGeocoder *geocoder;

@end

@implementation MyGeocoderViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    // Create a geocoder and save it for later.
    self.geocoder = [[CLGeocoder alloc] init];
}
- (void)geocodeAddress:(NSString *)addressString
{
    // perform geocode
    [geocoder geocodeAddressString:addressString
        completionHandler:^(NSArray *placemarks, NSError *error) {

        if ((placemarks != nil) && (placemarks.count > 0)) {
            NSLog(@"Placemark: %@", [placemarks objectAtIndex:0]);
        }
        // Should also check for an error and display it
        else {
            UIAlertView *alert = [[UIAlertView alloc] init];
            alert.title = @"No places were found.";
            [alert addButtonWithTitle:@"OK"];
            [alert show];
        }
    }];
}

@end
于 2012-04-23T19:31:29.350 回答
2

苹果文档中说:该方法将指定的位置数据异步提交给地理编码服务器并返回。您的完成处理程序块将在主线程上执行。发起正向地理编码请求后,不要尝试发起另一个正向或反向地理编码请求。

无需使用 GCD 在 IBOulet 上发送更新。

http://developer.apple.com/library/ios/#DOCUMENTATION/CoreLocation/Reference/CLGeocoder_class/Reference/Reference.html

于 2012-06-20T22:38:22.803 回答