[解決済み] NSRunLoopを理解する
質問
どなたか
NSRunLoop
というのは、私が知っているように
NSRunLoop
とは何か関係があるのでしょうか?
NSThread
に接続されているものですよね?そこで、次のようなThreadを作成したとします。
NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];
-(void) someMethod
{
NSLog(@"operation");
}
で、このスレッドが作業を終了した後、なぜ
RunLoops
を使用するのでしょうか? Appleのドキュメントから何かを読みましたが、私には明確ではありません。
どのように解決するのですか?
実行ループは、(とりわけ)システムの入力ソース(ソケット、ポート、ファイル、キーボード、マウス、タイマーなど)を処理するメカニズムを提供する抽象化されたものです。
各NSThreadはそれ自身のランループを持ち、currentRunLoopメソッドを通してアクセスすることができる。
一般に、ランループに直接アクセスする必要はありませんが、I/O処理に使用するランループを指定できる(ネットワーキング)コンポーネントもあります。
与えられたスレッドの実行ループは、その入力ソースの 1 つまたは複数が何らかのデータまたはイベントを持つまで待機し、適切な入力ハンドラーを起動して、quot;ready." となった各入力ソースを処理します。
そうした後、ループに戻り、さまざまなソースからの入力を処理し、行うべき仕事がなければ "sleep"します。
これがかなりハイレベルな説明です (あまり詳細を書かないようにしています)。
EDIT
コメントへの対応の試み。 バラバラにしました。
- ということは、スレッド内の実行ループにしかアクセス/実行できないってことですよね? ということですよね?
確かに。 NSRunLoopはスレッドセーフではないので、ループを実行しているスレッドのコンテキストからしかアクセスしてはいけません。
- 実行ループにイベントを追加する簡単な例はありますか?
ポートを監視したい場合、そのポートをランループに追加するだけで、ランループはそのポートの活動を監視することになります。
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
また、タイマーを明示的に追加する場合は
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- ループに戻るとはどういうことですか?
実行ループは、(そのモードに従って)各反復ごとにすべての準備されたイベントを処理します。 一般的な答えの範囲を少し超えているので、実行モードについて発見するために、ドキュメントを見る必要があります。
- スレッドを開始するとき、実行ループは非アクティブですか。
ほとんどのアプリケーションでは、メインのランループは自動的に実行されます。 しかし、実行ループを開始し、スピンしたスレッドに着信するイベントに応答する責任はあなたにあります。
- スレッドの外側のスレッド実行ループにいくつかのイベントを追加することは可能ですか?
何を言っているのかよくわかりません。 実行ループにイベントを追加するのではありません。 入力ソースとタイマーソースを追加します(ランループを所有するスレッドから)。 そして、ランループはそれらのアクティビティを監視します。 もちろん、他のスレッドやプロセスからデータ入力を提供することはできますが、入力は、ランループを実行しているスレッドでそれらのソースを監視しているランループによって処理されます。
- ランループを使用してスレッドを一時的にブロックすることができるということでしょうか。
確かに。 実際、実行ループは、イベントハンドラが戻るまでイベントハンドラに留まります。 これは、どんなアプリでも簡単に見ることができます。 スリープするIOアクション(例えば、ボタン押下)用のハンドラをインストールします。 そのメソッドが完了するまで、メインの実行ループ (および UI 全体) をブロックすることになります。
同じことが任意の実行ループに適用されます。
ランループについては、以下のドキュメントを読むことをお勧めします。
https://developer.apple.com/documentation/foundation/nsrunloop
と、それらがスレッド内でどのように使用されるかを説明します。
関連
-
XCode のコンパイル例外を解決する clang: error: linker command failed with exit code 1
-
IOSラーニングノート「このクラスはxxxのキーバリューコーディングに対応していません」問題解決
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] 文字列の長さを取得する
-
[解決済み] SwiftでStringを配列に分割する?
-
[解決済み] UIViewに角丸をつける
-
[解決済み] SwiftでURLから画像を読み込む/ダウンロードする
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み] iOSアプリをApple Developer Programや脱獄せずにデバイス上でテストすることができます。
-
[解決済み] swiftで電子メールアドレスを検証する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] iOSのステータスバーの文字色を変更する方法
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] UITextFieldのテキスト変更イベント
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] iOSで現在のデバイスの言語を取得するには?
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] Swift 3でディスパッチキューを作成する方法
-
[解決済み] iPhoneでナビゲーションバーを1ページ目だけ非表示にする
-
[解決済み] swiftで電子メールアドレスを検証する方法は?