3

私はIOS5用のiPhoneアプリを開発しています。現在、CoreLocationフレームワーク内にあるCLGeocoderクラスを使用しています。ジオコーディングが行われた後、または同時に、完了ハンドラブロックが最後に呼び出されたかどうかがわかりません。

完了ハンドラブロックがメインスレッドで実行されていることだけを知っています。ジオコーディングの完了時に完了ハンドラーブロックが実行されるかどうか、またはジオコーダーが別のスレッドで実行されている間に手元のタスクを完了するためのコードがあるかどうかを誰かが知っていますか?

4

2 に答える 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
于 2012-04-23T19:31:29.350 に答える
2

Appleのドキュメントには、次のように記載されています。このメソッドは、指定された位置データをジオコーディングサーバーに非同期で送信し、戻ります。完了ハンドラブロックはメインスレッドで実行されます。フォワードジオコーディングリクエストを開始した後は、別のフォワードジオコーディングリクエストまたはリバースジオコーディングリクエストを開始しないでください。

IBOuletで更新をディスパッチするためにGCDを使用する必要はありません。

http://developer.apple.com/library/ios/#DOCUMENTATION/CoreLocation/Reference/CLGeocoder_class/Reference/Reference.html

于 2012-06-20T22:38:22.803 に答える