実行ループは、(とりわけ)システム入力ソース(ソケット、ポート、ファイル、キーボード、マウス、タイマーなど)を処理するメカニズムを提供する抽象化です。
各NSThreadには独自の実行ループがあり、currentRunLoopメソッドを介してアクセスできます。
一般に、実行ループに直接アクセスする必要はありませんが、I / O処理に使用する実行ループを指定できる(ネットワーク)コンポーネントがいくつかあります。
特定のスレッドの実行ループは、その1つ以上の入力ソースにデータまたはイベントがあるまで待機してから、適切な入力ハンドラを起動して、「準備完了」の各入力ソースを処理します。
その後、ループに戻り、さまざまなソースからの入力を処理し、実行する作業がない場合は「スリープ」します。
これはかなり高レベルの説明です(詳細が多すぎないようにします)。
編集
コメントに対処する試み。私はそれをバラバラにしました。
- これは、スレッド内でループを実行するためにのみアクセス/実行できることを意味しますか?
確かに。NSRunLoopはスレッドセーフではないため、ループを実行しているスレッドのコンテキストからのみアクセスする必要があります。
- ループを実行するイベントを追加する簡単な例はありますか?
ポートを監視する場合は、そのポートを実行ループに追加するだけで、実行ループはそのポートのアクティビティを監視します。
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
タイマーを明示的に追加することもできます
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
実行ループは、(モードに応じて)反復ごとにすべての準備完了イベントを処理します。一般的な答えの範囲を少し超えているので、実行モードについて見つけるためにドキュメントを見る必要があります。
- スレッドを開始すると、実行ループは非アクティブですか?
ほとんどのアプリケーションでは、メインの実行ループが自動的に実行されます。ただし、実行ループを開始し、スピンするスレッドの着信イベントに応答する必要があります。
- スレッド外のスレッド実行ループにいくつかのイベントを追加することは可能ですか?
ここで何を言っているのかわかりません。実行ループにイベントを追加しません。入力ソースとタイマーソースを追加します(実行ループを所有するスレッドから)。次に、実行ループがアクティビティを監視します。もちろん、他のスレッドやプロセスからのデータ入力を提供することもできますが、入力は、実行ループを実行しているスレッド上のそれらのソースを監視している実行ループによって処理されます。
- 実行ループを使用して一時的にスレッドをブロックできるという意味ですか
確かに。実際、実行ループは、イベントハンドラーが戻るまで、イベントハンドラー内にとどまります。これはどのアプリでも十分簡単に見ることができます。スリープするIOアクション(ボタンを押すなど)のハンドラーをインストールします。そのメソッドが完了するまで、メインの実行ループ(およびUI全体)をブロックします。
同じことがどの実行ループにも当てはまります。
実行ループに関する次のドキュメントを読むことをお勧めします。
https://developer.apple.com/documentation/foundation/nsrunloop
スレッド内での使用方法:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1