2

シナリオは次のとおりです。

私はDownloadManager、ユーザーがダウンロード、一時停止、キャンセル、すべてのダウンロード、およびすべての一時停止を可能にする を書いています。はDownloadManagerシングルトンで、AFNetworkingファイルのダウンロードに使用します。独自のプライベート管理対象オブジェクト コンテキストがあるため、ユーザーはアプリケーションの他の部分を (追加、編集、削除することによって) コア データ オブジェクトを自由に使用できます。、、などのDownloadInfoダウンロード情報を格納するコア データ エンティティ があります。fileURLfileSizebytesReadDownloadManagerDownloadInfo

ダウンロードステータスをユーザーに表示するためにDownloadManagerViewController使用するがあります。NSFetchedResultsControllerこのダウンロード ビュー コントローラーは、メインのマネージド オブジェクト コンテキストを使用しています。

ここで、ダウンロード キューに 20 個のファイルがあるとします。そして、3 つの同時ダウンロードのみが許可されているとしましょう。ダウンロード マネージャーはファイルをダウンロードし、ダウンロードの進行状況を表示する必要があります。

問題:

オブジェクトは によって非常に高い速度でDownloadInfo更新されています。DownloadManagerDownloadManagerViewControllerダウンロードの進行状況を表示する責任がある)は、NSFetchedResultsControllerDelegateメソッドを使用してリストを更新しています。その結果、メイン キューで多くの処理が行われ、アプリケーションの応答性が非常に低下します。

どうすればこれを修正できますか? ダウンロードの進行状況を表示しながら、アプリケーションをレスポンシブにするにはどうすればよいですか?

  1. DownloadManagerとの間のダウンロード ステータスを他の方法で伝達する方法がわかりませんDownloadManagerViewController。これを行う別の/より良い方法はありますか?

  2. DownloadManager上記の理由から、メインのマネージド オブジェクト コンテキストを で使用したくありません。DownloadManagerAFNetworkingリクエストを非同期に処理していますが、最終的にはオブジェクトがメイン スレッドで更新されることに注意してくださいDownloadInfo(コールバック メソッドの結果として)。バックグラウンド スレッドでダウンロードとステータス更新操作を処理する方法があるのではないでしょうか? しかし、どのように?メイン スレッドとバックグラウンド スレッド間で通信するにはどうすればよいですか。つまり、バックグラウンド スレッドに別のファイルをダウンロード用にキューに入れるように指示するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

0

ViewController で実際に何が起こっているかを確認するために、Instruments を使用しようとしましたか? Time Profiler は、CPU がより多くの時間を費やしている場所を示し、問題の原因を特定するのに役立ちます。これを知らなければ、どのようなパフォーマンス調整を行うべきかを正確に知ることはできません。

Instruments を使用した後NSFetchedResultsController、VC の多くの更新が強制されている場合は、CoreData から進行状況を読み取らないことを検討する必要があります。多くのテーブルまたはビューが、描画を実行するよりも CoreData からの読み取りに多くの時間を費やしていることがわかりました。問題が CoreData の読み取りにあると推測すると、から進行状況を読み取りNSMutableDictionary、ダウンロードが特定のしきい値を超えたときに UI を更新しようとします。

于 2013-07-12T17:04:52.567 に答える