たとえば、サーバーからデータをダウンロードする必要がある100個のオブジェクトにGCDを利用したいと思います。これらのオブジェクトをループして、次のように呼び出すとします。
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(q, ^{
// Download data;
});
それらのブロックはインテリジェントにキューに入れられて効率的に実行されるでしょうか? それとも、メモリの問題、パフォーマンスの問題、さらには競合状態に陥るでしょうか?
私の2セントは、名前が示すようにブロックがキューに入れられ、ダウンロードが一度に1つずつ開始されることです。すべてのダウンロードが完了する前にアプリケーションが終了した場合、適切にクリーンアップしている限り、問題はないはずです.
ただし、別のボーナス質問:
たとえば、3 ~ 5 個のキューを作成し、キュー間でダウンロードを分散することにより、一度に複数のファイルをダウンロードすると、さらにメリットがありますか?
この機能を実装した後、受け入れられた回答が完全ではないか、ポイントを逃したようです。GCD によってディスパッチできるスレッドの最大数 (~64) があるため、コンカレントキューであるグローバル キューでブロックをディスパッチすると、問題が発生する可能性があります。これは、操作ごとにスレッドを生成する必要があるため、同時キューにのみ当てはまります。dispatch_async
ただし、独自のキューを作成すると、そのキューは、が呼び出された場合でもブロックを 1 つずつ実行するシーケンシャル キューになります。このようにして、キューが 1 つのスレッドのみを生成し、操作をキューに入れ、スレッド制限の問題に達することがないことを確認できます。