実行ループは、(とりわけ)システム入力ソース(ソケット、ポート、ファイル、キーボード、マウス、タイマーなど)を処理するメカニズムを提供する抽象化です。
各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