2011-10-25 3 views
1

MKMapViewに何千ものピンを表示する必要があります。ピンを追加できる優れたデリゲートメソッドが必要です。 didUserUpdateLocationは複数回発生したため不良です。何千ものピンをMKMapViewに追加する最良の方法は何ですか?MKMapViewマップ上に何千ものピンをロード

UPDATEは:

は、私はちょうど1時間のみのピンをロードするためにBOOLチェックを使用し、本当に良い仕事に見えました!

-(void) mapView:(MKMapView *) mv didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    NSLog(@"didUpdateUserLocation"); 

    if(self.isMapped) return; 

    for(Facility *facility in self.facilities) 
    { 
     CLLocationCoordinate2D facilityCoord = { facility.latitude,facility.longitude }; 


     MapPoint *mp = [[MapPoint alloc] initWithCoordinate:facilityCoord title:facility.facilityName]; 



     [mv addAnnotation:mp]; 

    } 

    self.isMapped = YES; 

} 
+0

下記のJanoの答えを考えてください。デバイスのメモリの制約のため、必要に応じてピンをロードする必要があります。これがデリゲートメソッドの理由です。 wwdc 2010のビデオをチェックしてください。彼らはそこにいくつかの良いマップキットの最適化を持っています。 – timthetoolman

+0

@timthetoolmanはい良いアドバイス! – azamsharp

答えて

8

私はmapView:regionDidChangeAnimated:を使用します。私は、現在の地域とその周辺のピンを取得するために、緯度と経度によるコアデータフィルタリングからデータを引き出し、ユーザーがデータを再度プルしないで少しスクロールできるようにします。

ズームアウトするときに、K-Meansアルゴリズムを使用して実行時に事前計算または計算できるデータのクラスタ化バージョンを表示することができます。

オブジェクトの代わりに構造体に基づいて軽量データ構造を使用するために大量のデータを使用すると役立ちます。

ピンを追加および削除するときに、フェードイン/フェードアウトをアニメートしてトランジションを滑らかにすることができます。画面上に物を出し入れするのは悪いユーザー体験です。

サーバーコールがこのすべてに関係している場合は、NSOperationsでコールをカプセル化して、ユーザーがマップをあまりに速く移動したときに古いコールを取り消すことができます。

+0

最新の質問をチェックしてください!ピンが最初にロードされるようにBOOLフラグを追加しました。 – azamsharp

+0

唯一の懸念事項は、一度ピンを追加することですが、[viewDidLoad](http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html)は、ビューが読み込まれるときに一度だけ実行されます。 – Jano

+0

あなたは正しいです! viewDidLoadが理にかなっています!すべての助けをありがとう!心から感謝する! – azamsharp

関連する問題