我如何等待geocodeAddressString iPhone的结果

时间:2012-11-06 13:03:03

标签: xcode locking dispatch

我知道它与锁或调度组有关,但我似乎无法编码...

在离开方法之前,我需要知道地址是否是有效地址。目前线程只是溢出并返回TRUE。我试过锁,调度工程,但似乎无法正确。任何帮助表示赞赏:

- (BOOL) checkAddressIsReal
{
    __block BOOL result = TRUE;

    // Lets Build the address
    NSString *location = [NSString stringWithFormat:@" %@ %@, %@, %@, %@", streetNumberText.text, streetNameText.text, townNameText.text, cityNameText.text, countryNameText.text];

    // Put a pin on it if it is valid

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:location
                 completionHandler:^(NSArray* placemarks, NSError* error) {
        result = [placemarks count] != 0;
    }];

    return result;
}

2 个答案:

答案 0 :(得分:0)

文档说明CLGeocoder在主线程上调用completionHandler。由于您可能还在主线程中调用方法,因此无法等待地理编码器的答案,而不会给它提供结果的机会。

这可以通过轮询runloop来完成,使用一些API作为-[NSRunLoop runMode:beforeDate:]

缺点是,根据模式,这也会在等待结果时传递事件和火警计时器。

答案 1 :(得分:0)

只需使用block作为参数:

- (void) checkAddressIsRealWithComplectionHandler:(void (^)(BOOL result))complectionHandler
{
    __block BOOL result = TRUE;

    // Lets Build the address
    NSString *location = [NSString stringWithFormat:@" %@ %@, %@, %@, %@", streetNumberText.text, streetNameText.text, townNameText.text, cityNameText.text, countryNameText.text];

    // Put a pin on it if it is valid

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:location
                 completionHandler:^(NSArray* placemarks, NSError* error) {
                     result = [placemarks count] != 0;
                     complectionHandler(result);
                 }];
}