2012-04-23 9 views
3

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

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

答えて

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 
+0

良い応答ありがとう。それは役に立ちました。 – infinitpossibilities

+0

アップルのドキュメントにはもう一つの注意があります:«あなたの完了ハンドラブロック**はメインスレッドで実行されます**。 –

+0

@AliakseiN。ありがとう、私は答えを更新しました。 –

2

アップルのドキュメントは言う: このメソッドは非同期に戻りジオコーディングサーバーに指定された位置データを送信します。完了ハンドラブロックは、メインスレッド上で実行されます。順方向ジオコーディング要求を開始した後、別の順方向ジオコーディングまたは逆方向ジオコーディング要求を開始しないでください。

IBOuletにアップデートをディスパッチするためにGCDを使用する必要はありません。

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