2012-02-07 11 views
4

地図ビューに最初にアノテーションを完全に読み込むことができます。しかし、ボタンをクリックして(すでにロードされている)マップをリロードしようとすると、ユーザーはプロセスが完了するまで待つ必要があります。 この問題は、リロード時にmapviewが大きく動かされるまで、新しい注釈が表示されない、つまりviewForAnnotationが起動するために発生します。私は 'performSelectorInBackground' & 'performSelectorOnMainThread'を含むソリューションで私のような他の2つの質問を見ました。前者は私のために働いていませんでした:(&後者はしたくないです(しかし、これは唯一のオプションです)。ユーザーがマップとやりとりすることができるように、注釈がメインスレッドをブロックせずにロードされるようにしたいのですが、そのようなアニメーションは主なスレッドで最もうまくいくことを知っているので、質問1.マップをリロードするまでユーザーを待たせる以外の方法はありませんか?2.それを行う最良の方法に関する提案?事前に 感謝。メインスレッドをブロックせずにmapviewアノテーションを追加/再読み込み

答えて

4

現在地この を達成するために、ディスパッチキューのブロックを使用することができます。この

dispatch_queue_t queue = dispatch_queue_create("com.MyApp.AppTask",NULL); 
dispatch_queue_t main = dispatch_get_main_queue(); 
    dispatch_async(queue, 
    ^{ 
     //do the fetching of data here(Don't do any UI Updates) 
     dispatch_async(main, 
     ^{ 
      // Do the UI Update here. 
     }); 

    }); 
のようなプライベートキューにあなたを作成することができ、構文
です

Appleはこれを再帰分解と呼んでいます。
dispatch_async()
dispatch_async()のバックグラウンドスレッドに計算がオフロードされ、バックグラウンドスレッドで計算された更新データでブロックが実行されるようにスケジュールされます。

+0

これを試してみるのはちょっと短かったので、バックグラウンドスレッドでデータを取得し、メインスレッドにアノテーションを表示しました。おそらくディスパッチキューに対する同様のアプローチ。それを解決策としてマークします。 – akdsouza

+2

残念ながら、これは同時に100の注釈を追加/削除する問題を解決しません。あなたが言ったように、すべてのUI操作はメインスレッドになければなりません。これを解決するには、クラスタリングやその他の方法(画面の中央に最も近い最上位の50を表示)のいずれかを使用して、一度に画面上のピン数を制限するだけです。 – Sean

+1

また、別のキューを必要としないので、単にdispatch_get_global_queueを使用してください – aryaxt

関連する問題