2

マップ上の注釈の更新中にアクティビティ インジケーターを追加しようとしています。しかし、それはそのような方法ではうまくいかないようです。更新プロセスが開始されると、アプリケーション画面が無効になり、フリーズするため、アクティビティ インジケーターが表示されない可能性があります。

私の質問は、アプリと非同期でマップ上の注釈を更新できるので、アクティビティ インジケーターが表示されるかどうかです。

2秒以上かかるとインジケーターが表示されないのは、ユーザーにとって本当に迷惑だと思います。

解決:

self.activityIndicator.startAnimating()
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), {
                self.showPins(self.initialLat, locationLong: self.initialLong)
            })
self.activityIndicator.stopAnimating()
4

1 に答える 1

2

次のことを行っていることを確認する必要があります。

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 ' ライブラリをいくつかのシンタックス シュガーに使用します。

于 2016-02-22T16:28:10.970 に答える