2

次のコード ブロックでは、最初のメソッドが 2 番目のメソッドを呼び出します。このメソッドは、ジオコーディング プロセスの結果を返す必要があります。

- (void)foo {
    CLPlacemark *currentMark = [self reverseGeocodeLocation:locationManager.location];
}

- (CLPlacemark *)reverseGeocodeLocation:(CLLocation *)location {
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    __block CLPlacemark *placeMark;
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        if (!error) {
            if ([placemarks firstObject])
                placeMark = [placemarks firstObject];
        }
    }];
    return placeMark;
}

ただし、プログラムの実行は続行する前にジオコーディングが完了するのを待たないため (したがって完了ブロック)、placeMarkジオコーディング プロセスが完了して完了ブロックが呼び出される前に変数がインスタンス化されずに返される危険性が常にあります。Web サービスに対して HTTP 要求を行ったときに、その結​​果が不確定な時間返されないという同じ苦境に直面したことがあります。

foo私がこれまで見てきた唯一の解決策は、ジオコーダーの完了ブロック内のすべてのコードをネストすることです。

2 番目のメソッドの完了ブロックの結果にcurrentMark変数を入れ子にせずに設定するための最良の方法は何ですか?foo

4

2 に答える 2