2010-12-14 5 views
0

私はMKReverseGeocoderDelegateの設定についてちょっと混乱しています.Appleの例では、MKReverseGeocoderをプロパティiVarに割り当てていることに気付きました。最後に、位置が見つかるとMKReverseGeocoderを割り当ててMKReverseGeocodersを解放します成功か失敗かを報告してください。 MKReverseGeocoder Class ReferenceMKReverseGeocoderDelegateをセットアップしますか?

// ------------------------------------------------------------------- ** 
// DELEGATE: CLLocationManager 
// ------------------------------------------------------------------- ** 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation { 

    MKReverseGeocoder *myGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:[newLocation coordinate]]; 
    [myGeocoder setDelegate:self]; 
    [myGeocoder start]; 
} 

// ------------------------------------------------------------------- ** 
// DELEGATE: MKReverseGeocoderDelegate 
// ------------------------------------------------------------------- ** 

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark { 
    NSLog(@"%@", [placemark locality]); 
    [geocoder release]; 
} 

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error { 
    [geocoder release]; 
} 
@end 

答えて

3

メモリ管理に関しては問題ありません。インストゥルメントのリークツールでこれを実行すると、locationManager:didUpdateメソッドでリークの可能性があると不平を言っているかもしれませんが、それは間違っています。

ただし、ジオコーダーへの影響を減らすためにいくつかのことを行います。私は見て、あなたがちょうどdidUpdateの場所が正確に話す価値があることを確認します。コアの場所が最初に生まれてくると、ハードウェアが実際に起動して受信する前に、ゴミヒットが出る可能性が高くなります。そして、実際の場所の精度が狭くなります(Google Mapsアプリでは、実際に何が起こっているかがわかります。実際の場所には青い円が表示されます)。 100メートル程度の精度が得られるまで、ジオコーディングのポイントはありません。

EDIT:(あなたが時折そこに負の数を取得します(かなり頻繁にあるかもしれない)最後の更新と同じ、無効な精度を有するものであるアップデートを無視すべきである。この

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation { 

    if((newLocation.coordinate.latitude != oldLocation.coordinate.latitude) && 
    (newLocation.coordinate.longitude != oldLocation.coordinate.longitude) && 
    ([newLocation horizontalAccuracy] < 100 && [newLocation horizontalAccuracy] > 0)) 
    { 

     MKReverseGeocoder *myGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:[newLocation coordinate]]; 
     [myGeocoder setDelegate:self]; 
     [myGeocoder start]; 
    } 
} 

を試してみてください、場所のハードウェアが最初に起動されたとき)、または水平精度が100メートルを超える場合

また、これを一度だけ行いたい場合は、有効で十分に正確な位置を取得したら、CLLocationManagerの更新を停止してください。

+0

ダン、geoCoderへの影響を減らすためのコードがありますが、まだXcodeで実装していません。私はちょうど私が右のトラックのメモリ管理に賢明だったことを確認したいと思った。 – fuzzygoat

1

は、Appleが

各マップKitアプリケーションは、逆ジオコーディング能力の限られた量を持っていると言うので、それは控えめ逆ジオコードリクエストを使用するようにあなたの利点にあります。

  • 1つのユーザーアクションに対して最大1つの逆ジオコーディング要求を送信します。あなたのケースで

(...)

低速のネットワーク接続(すなわち位置変化が速い場所検索次にある)が存在する場合、複数の要求をインスタンス化することができます。

ほとんどの場合、あなたのコードは正常に動作するでしょうが、それを実装するための推奨方法ではありません。 「ほとんどの場合」しか動作しないものを実装することは、まったくグーグルアイデアではありません。

+0

上記のコードはこれを反映していませんが、アプリケーションは単にタイマー(つまり5分ごとに1つ)の場所を尋ねるだけです。アイデアは、場所が見つかると、位置マネージャー(およびジオコーダー要求)は次回にタイマーが起動します。また、私は約4〜5個のCLLocationオブジェクトを受け取っていることに注意してください。私は最も正確なジオコードを探します。だから私のタイマーは私の "ユーザアクション"であり、 "ジオコード"リクエストはそのタイマーの起動にリンクされた単一のアクションだと思います。 – fuzzygoat

+0

この場合、コードは問題ないと思います。 –

+0

bjorn、それは確かに有効な点であり、私のデザインについて考えさせてくれました。(+1) – fuzzygoat

関連する問題