iOS5 CLGeocoder

3
我正在开发一个适用于IOS5的iPhone应用程序。我目前正在使用位于CoreLocation框架内的CLGeocoder类。我无法确定完成处理程序块是在地理编码结束后还是同时调用的。
我只知道完成处理程序块在主线程上运行。有人知道完成处理程序块是否在地理编码完成后运行,还是在地理编码器在另一个线程上执行时完成任务的代码?
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

苹果文档还有另一个注释:“您的完成处理程序块将在主线程上执行。” - Aleks N.
@nevanking,dispatch_async(dispatch_get_main_queue()是否必要?文档中指出完成块将在主线程上执行。 - Kris Gellci

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接