MacコマンドラインツールでDispatchQueue.main.asyncをswiftで使用するときに、実行ループが必要なのはなぜですか?

Aug 15 2020

メインのディスパッチキューにタスクを実装するためにrunloopを使用する必要がある理由を理解しているAppleのドキュメントを見つけました。

Appleのドキュメントによると、

メインディスパッチキューは、アプリケーションのメインスレッドでタスクを実行するグ​​ローバルに利用可能なシリアルキューです。このキューは、アプリケーションの実行ループ(存在する場合)と連携して、キューに入れられたタスクの実行を、実行ループに接続されている他のイベントソースの実行とインターリーブします。メインキューはアプリケーションのメインスレッドで実行されるため、アプリケーションのキー同期ポイントとしてよく使用されます。

しかし、それでも、「なぜ」実行ループが必要なのか理解できません。「実行ループが必要なため、実行ループが必要」のように聞こえます。誰かがこれについて私に説明してくれたらとてもありがたいです。ありがとうございました。

回答

1 matt Aug 15 2020 at 19:37

メインディスパッチキューにタスクを実装するために実行ループを使用する必要がある理由

すでに使用しているので、通常は使用しません。

アプリケーションプロジェクトには、すでにメインキューの実行ループがあります。たとえば、iOSアプリプロジェクトは、実際にはUIApplicationMainへの1つの巨大な呼び出しにすぎず、実行ループを提供します。

これが、ユーザーが何かをするのを待ってそこに座ることができる方法です。実行ループは、ええと、実行中です。そしてループ。

しかし、たとえばMacコマンドラインツールでは、自動実行ループはありません。主な機能を実行し、すぐに終了します。それを行わないようにする必要がある場合は、実行ループを指定します。

1 KavinduChathuranga Aug 15 2020 at 18:52

DispatchQueue.main.async バックグラウンドキューでコードを実行していて、メインキューで特定のコードブロックを実行する必要がある場合です。

コードでviewDidLoadは、はすでにメインキューで実行されているため、DispatchQueue.main.asyncを使用する理由はほとんどありません。

しかし、それを使用することは必ずしも間違っているわけではありません。しかし、それは実行の順序を変更します。

非同期クロージャは、現在のrunloopが完了した後に実行するためにキューに入れられます。

Rob Aug 15 2020 at 23:56

「なぜ」実行ループが必要なのか理解できません

通常、コマンドラインアプリには実行ループは必要ありません。実行ループが特別に必要な場合(たとえば、ユーザー入力を待つ間にいくつかのタスクを実行する動的UIがある場合)は実行ループを使用できますが、コマンドラインアプリの大部分は実行ループを必要としません。

ドキュメントは言います:

実行ループは、作業をスケジュールし、着信イベントの受信を調整するために使用するイベント処理ループです。実行ループの目的は、実行する作業がある場合はスレッドをビジー状態に保ち、作業がない場合はスレッドをスリープ状態にすることです。

したがって、アプリにいくつかの着信イベントを待機させる必要がある場合、またはキュー間でタスクを非同期にディスパッチする場合は、実行ループを使用しますが、それ以外の場合は気にしないでください。ほとんどのコマンドラインアプリは、実行ループをまったく使用する必要がありません。