mapView に delegate method があるの知らなかった・・・

MapKit を使うアプリを作ってて、user location と goal location の距離や方角を計算しようとしたときの話。

user location の緯度・経度を調べるとどちらも 0 になってしまい、緯度・経度 0 の地点が現在地になり、距離なんてすごいことに・・・

viewDidLoad に書いていたので、タイミングが悪いんだろうなぁとは思っていたけれども、じゃあ、果たしてどこに処理を書けばよいのか。sleep させたらその隙に設定されたりしてとか試してみたけど、ダメ。そりゃそうだ。

調べたところ、mapView には delegate method が用意されているので、例えば、mapViewDidFinishLoadingMap 辺りに処理を書くと、現在地も設定されている状態で、値も取れてよい。

うーん、知らなかった・・。

 

後日続き。

その後、mapViewDidFinishLoadingMap に処理を書いたら失敗。地図の縮尺を変えたりした時にもこの method は呼ばれるので、頻繁に method が呼ばれてしまい、何度も呼ばれるもんだから通常の処理に支障が出てしまった・・・

しょうがないので、property を一つ追加して、semaphore として利用することにしたらうまくいった。

@property ( nonatomic ) Boolean isFirstStrikePin; 

のように定義しておいて、viewDidLoad では NO にしておき、mapViewDidFinishLoadingMap で、property が NO だったら YES に設定後、処理を行う。semaphore の代わりに、KVO で、property の値が変更したら処理するとしてもよかったんだけど、できることは同じなのでより簡潔なこれでいいや。