0

ロックやディスパッチグループと関係があることは知っていますが、コーディングできないようです...

メソッドを終了する前に、アドレスが有効なアドレスであったかどうかを知る必要があります。現在、スレッドはオーバーランして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;
}
4

2 に答える 2

0

ドキュメントには、メインスレッドでをCLGeocoder呼び出すと書かれています。completionHandlerおそらくメインスレッドからもメソッドを呼び出しているので、結果を提供する機会を与えずにジオコーダーの応答を待つことはできません。

これは、いくつかのAPIをとして使用して、runloopをポーリングすることによって行われます-[NSRunLoop runMode:beforeDate:]

欠点は、モードによっては、結果を待っている間にイベントと起動タイマーも配信されることです。

于 2012-11-06T13:37:10.370 に答える
0

パラメータとしてブロックを使用するだけです。

- (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);
                 }];
}
于 2015-06-05T11:06:04.480 に答える