完了ハンドラーは、ジオコーダーがジオコーディングを終了した後に実行されます。つまり、ジオコーディングタスクの完了時に実行されます。ジオコーダーの実行中に他のタスクを完了するためのものではありません。
完了ハンドラに目印とエラーが含まれています。ジオコーディングが成功した場合は、目印配列が取得されます。そうでない場合は、エラーが発生します。ドキュメントから
注:
このメソッドは非同期に戻りジオコーディングサーバーに指定された位置データを送信します。完了ハンドラブロックは、メインスレッド上で実行されます。順方向ジオコーディング要求を開始した後、別の順方向ジオコーディングまたは逆方向ジオコーディング要求を開始しないでください。
ジオコーディングリクエストはアプリごとにレート制限があるため、短時間でリクエストを増やすとリクエストの一部が失敗することがあります。最大レートを超えると、ジオコーダーは値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
良い応答ありがとう。それは役に立ちました。 – infinitpossibilities
アップルのドキュメントにはもう一つの注意があります:«あなたの完了ハンドラブロック**はメインスレッドで実行されます**。 –
@AliakseiN。ありがとう、私は答えを更新しました。 –