シナリオは次のとおりです。
私はDownloadManager、ユーザーがダウンロード、一時停止、キャンセル、すべてのダウンロード、およびすべての一時停止を可能にする を書いています。はDownloadManagerシングルトンで、AFNetworkingファイルのダウンロードに使用します。独自のプライベート管理対象オブジェクト コンテキストがあるため、ユーザーはアプリケーションの他の部分を (追加、編集、削除することによって) コア データ オブジェクトを自由に使用できます。、、などのDownloadInfoダウンロード情報を格納するコア データ エンティティ があります。fileURLfileSizebytesReadDownloadManagerDownloadInfo
ダウンロードステータスをユーザーに表示するためにDownloadManagerViewController使用するがあります。NSFetchedResultsControllerこのダウンロード ビュー コントローラーは、メインのマネージド オブジェクト コンテキストを使用しています。
ここで、ダウンロード キューに 20 個のファイルがあるとします。そして、3 つの同時ダウンロードのみが許可されているとしましょう。ダウンロード マネージャーはファイルをダウンロードし、ダウンロードの進行状況を表示する必要があります。
問題:
オブジェクトは によって非常に高い速度でDownloadInfo更新されています。DownloadManager(DownloadManagerViewControllerダウンロードの進行状況を表示する責任がある)は、NSFetchedResultsControllerDelegateメソッドを使用してリストを更新しています。その結果、メイン キューで多くの処理が行われ、アプリケーションの応答性が非常に低下します。
どうすればこれを修正できますか? ダウンロードの進行状況を表示しながら、アプリケーションをレスポンシブにするにはどうすればよいですか?
DownloadManagerとの間のダウンロード ステータスを他の方法で伝達する方法がわかりませんDownloadManagerViewController。これを行う別の/より良い方法はありますか?DownloadManager上記の理由から、メインのマネージド オブジェクト コンテキストを で使用したくありません。DownloadManagerはAFNetworkingリクエストを非同期に処理していますが、最終的にはオブジェクトがメイン スレッドで更新されることに注意してくださいDownloadInfo(コールバック メソッドの結果として)。バックグラウンド スレッドでダウンロードとステータス更新操作を処理する方法があるのではないでしょうか? しかし、どのように?メイン スレッドとバックグラウンド スレッド間で通信するにはどうすればよいですか。つまり、バックグラウンド スレッドに別のファイルをダウンロード用にキューに入れるように指示するにはどうすればよいですか?
ありがとう。