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