MacコマンドラインツールでDispatchQueue.main.asyncをswiftで使用するときに、実行ループが必要なのはなぜですか?
メインのディスパッチキューにタスクを実装するためにrunloopを使用する必要がある理由を理解しているAppleのドキュメントを見つけました。
Appleのドキュメントによると、
メインディスパッチキューは、アプリケーションのメインスレッドでタスクを実行するグローバルに利用可能なシリアルキューです。このキューは、アプリケーションの実行ループ(存在する場合)と連携して、キューに入れられたタスクの実行を、実行ループに接続されている他のイベントソースの実行とインターリーブします。メインキューはアプリケーションのメインスレッドで実行されるため、アプリケーションのキー同期ポイントとしてよく使用されます。
しかし、それでも、「なぜ」実行ループが必要なのか理解できません。「実行ループが必要なため、実行ループが必要」のように聞こえます。誰かがこれについて私に説明してくれたらとてもありがたいです。ありがとうございました。
回答
メインディスパッチキューにタスクを実装するために実行ループを使用する必要がある理由
すでに使用しているので、通常は使用しません。
アプリケーションプロジェクトには、すでにメインキューの実行ループがあります。たとえば、iOSアプリプロジェクトは、実際にはUIApplicationMainへの1つの巨大な呼び出しにすぎず、実行ループを提供します。
これが、ユーザーが何かをするのを待ってそこに座ることができる方法です。実行ループは、ええと、実行中です。そしてループ。
しかし、たとえばMacコマンドラインツールでは、自動実行ループはありません。主な機能を実行し、すぐに終了します。それを行わないようにする必要がある場合は、実行ループを指定します。
DispatchQueue.main.async
バックグラウンドキューでコードを実行していて、メインキューで特定のコードブロックを実行する必要がある場合です。コードで
viewDidLoad
は、はすでにメインキューで実行されているため、DispatchQueue.main.asyncを使用する理由はほとんどありません。しかし、それを使用することは必ずしも間違っているわけではありません。しかし、それは実行の順序を変更します。
非同期クロージャは、現在のrunloopが完了した後に実行するためにキューに入れられます。
「なぜ」実行ループが必要なのか理解できません
通常、コマンドラインアプリには実行ループは必要ありません。実行ループが特別に必要な場合(たとえば、ユーザー入力を待つ間にいくつかのタスクを実行する動的UIがある場合)は実行ループを使用できますが、コマンドラインアプリの大部分は実行ループを必要としません。
ドキュメントは言います:
実行ループは、作業をスケジュールし、着信イベントの受信を調整するために使用するイベント処理ループです。実行ループの目的は、実行する作業がある場合はスレッドをビジー状態に保ち、作業がない場合はスレッドをスリープ状態にすることです。
したがって、アプリにいくつかの着信イベントを待機させる必要がある場合、またはキュー間でタスクを非同期にディスパッチする場合は、実行ループを使用しますが、それ以外の場合は気にしないでください。ほとんどのコマンドラインアプリは、実行ループをまったく使用する必要がありません。