GCD の並行キューとシリアル キューを完全に理解するのに苦労しています。いくつか問題があり、誰かが明確かつ的確に答えてくれることを期待しています。
タスクを次々に実行するためにシリアル キューが作成され、使用されると読みました。ただし、次の場合はどうなるでしょうか。
- シリアルキューを作成する
dispatch_async
(先ほど作成したシリアルキューで)3回使用して、3つのブロックA、B、Cをディスパッチします。
次の 3 つのブロックが実行されます:
キューはシリアルなので、A、B、Cの順になります
または
- ASYNCディスパッチを使用したため、同時に(並列スレッドで同時に)実行できました。
ブロックを次々に実行するために、並行キューを使用できると読みました
dispatch_sync
。その場合、必要な数のブロックを同期的にディスパッチできる並行キューを常に使用できるのに、シリアル キューが存在するのはなぜですか?良い説明をありがとうございます!
ベストアンサー1
簡単な例: 実行に 1 分かかるブロックがあるとします。メイン スレッドからそれをキューに追加します。4 つのケースを見てみましょう。
- 非同期 - 同時実行: コードはバックグラウンド スレッドで実行されます。制御はすぐにメイン スレッド (および UI) に戻ります。ブロックは、そのキューで実行されている唯一のブロックであると想定することはできません。
- 非同期 - シリアル: コードはバックグラウンドスレッドで実行されます。制御はすぐにメインスレッドに戻ります。ブロックできるそのキューで実行されている唯一のブロックであると仮定する
- sync - 同時実行: コードはバックグラウンド スレッドで実行されますが、メイン スレッドはそれが完了するまで待機し、UI の更新をブロックします。ブロックは、そのキューで実行されている唯一のブロックであると想定することはできません (数秒前に async を使用して別のブロックを追加できた可能性があります)。
- sync - serial: コードはバックグラウンドスレッドで実行されますが、メインスレッドはそれが完了するまで待機し、UIの更新をブロックします。ブロックできるそのキューで実行されている唯一のブロックであると仮定する
当然ながら、長時間実行されるプロセスには、最後の 2 つのどちらも使用しません。通常、これは、別のスレッドで実行されている可能性のあるものから UI (常にメイン スレッド上) を更新しようとしているときに表示されます。