1

データ処理のための同時操作があります。処理中に、場所のリバース ジオコーディングを取得する必要があります。- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandlerもバックグラウンド スレッドでジオコーディング リクエストを実行し、呼び出しの直後に戻ることが知られています。geocoded がリクエストを終了すると、メイン スレッドで完了ハンドラを実行します。ジオコーダが結果を取得するまで、同時操作をブロックするにはどうすればよいですか?

__block CLPlacemark *_placemark

- (NSDictionary *)performDataProcessingInCustomThread
{
    NSMutableDictionary *dict = [NSMutableDictionary alloc] initWithCapacity:1];
    // some operations

    CLLocation *location = [[CLLocation alloc] initWithLatitude:40.7 longitude:-74.0];
    [self proceedReverseGeocoding:location];

    // wait until the geocoder request completes

    if (_placemark) {
        [dict setValue:_placemark.addressDictionary forKey:@"AddressDictionary"];

    return dict;
}

- (void)proceedReverseGeocoding:(CLLocation *)location
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        if ([error code] == noErr) {
            _placemark = placemarks.lastObject;
        }
    }];
}
4

1 に答える 1

2

これを実現するには、 を使用できますdispatch_semaphore_t。まず、クラスにセマフォを追加する必要があります。

dispatch_semaphore_t semaphore;

データを処理し、ジオコーディング データを受け取る準備ができたら、ディスパッチ セマフォを作成し、シグナルの待機を開始する必要があります。

semaphore = dispatch_semaphore_create(0);
[self proceedReverseGeocoding:location];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

CLGeocodeCompletionHandler の最後に必要なのは、信号を送信してデータ処理を再開することだけです。

dispatch_semaphore_signal(semaphore);

この後、データ処理が続行されます

于 2012-10-15T16:16:26.403 に答える