その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

iOS 5.0 より追加された CLGeocoder を使用して逆ジオコーディング

Appleのドキュメントによると

iOS 5.0では、MKReverseGeocoderとMKReverseGeocoderDelegateは非推奨になっているの で、新たにアプリケーションを開発する場合はCLGeocoderを使ってください。

とのことなので、逆ジオコーディングを CLGeocoder を使用してやってみたのでその手順をこちらにメモしておきます。
(上記Appleのドキュメントのコードは少しずつ変数名が間違ってたり、独自定義のクラスが引数の型に指定されていたりして、そのままでは使いづらい・・・)


で、手順といってもヘッダのインポートやオブジェクトの生成とかを除けば、

  • reverseGeocodeLocation:completionHandler: を呼ぶ

これしかありません・・・


僕の場合は下記のようにクラスメソッドを定義しました。

+ (void)reverseGeocodeLocation:(CLLocation *)location
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:location completionHandler:
     ^(NSArray* placemarks, NSError* error) {
         if ([placemarks count] > 0) {
             
             CLPlacemark *placemark = (CLPlacemark *)[placemarks lastObject];

             // 取得したplacemarkを格納したNSNotificationを発行
         }
     }];
}

Blocksで非同期に処理されるので、CLPlacemarkオブジェクトを取得したらNSNotificationを発行して必要なオブジェクトに通知するようにしました。


なお、reverseGeocodeLocation:completionHandler: で得られる値が NSArray 型になっていますが、CLGeocoderのクラスリファレンスによると

Contains an array of CLPlacemark objects. For most geocoding requests, this array should contain only one entry. However, forward-geocoding requests may return multiple placemark objects in situations where the specified address could not be resolved to a single location.

とあり、逆ジオコーディングのときは基本的に1つしかオブジェクトが入ってこないと思ってよさそうです。(正ジオコーディングのときはアドレス→緯度経度なので、1つとは限らないため、NSArrayになっている)