次のことを行っていることを確認する必要があります。
1.一度にすべての注釈をロードする
Apple は、MKMapView クラス リファレンスで、すべての注釈 (ピン) を一度にロードすることを推奨しています。
マップ インターフェイスを構成するときは、すべての注釈オブジェクトをすぐに追加する必要があります。マップ ビューは、各注釈オブジェクトの座標データを使用して、対応する注釈ビューをいつ画面に表示する必要があるかを判断します。[...] 注釈ビューは画面上にある場合にのみ必要になるため、MKMapView クラスは、使用されていない注釈ビューをキューに入れるためのメカニズムを提供します。再利用識別子を持つ注釈ビューは、マップ ビューが画面外に移動するときに、切り離して内部的にキューに入れることができます。この機能は、少数の注釈ビューのみをメモリに一度に保持し、持っているビューを再利用することで、メモリの使用を改善します。また、マップのスクロール中に新しいビューを作成する必要がなくなるため、スクロールのパフォーマンスも向上します。
2. 注釈ビューを再利用する
メソッドでdequeueReusableAnnotationViewWithIdentifierを使用して、既存の注釈ビューを正しく再利用していることを確認する必要がありますviewForAnnotation
。
3. バックグラウンド スレッドに重い負荷をかける
注釈を一度にフェッチ/ロードできない場合は、Grand Central Dispatchを使用して「重い」メソッドをバックグラウンド スレッドで実行し、UI がブロックされないようにすることができます。注: そのメソッド内 (bg スレッド) からの UI への変更は、メイン UI スレッドで明示的に行う必要があります。
バックグラウンドについては、この Stackoverflow の回答をご覧ください。
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
print("This is run on the background queue")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
print("This is run on the main queue, after the previous code in outer block")
})
})
または、この ' Async ' ライブラリをいくつかのシンタックス シュガーに使用します。