NSRunLoop
フレームワーク:OS X 10.0 以降の Foundation。関連項目
概観
NSRunLoop クラスは、入力ソースを管理するオブジェクトへのプログラム・インタフェースを宣言します。 NSRunLoop オブジェクトは、ウィンドウシステムから、マウスとキーボードのイベント、NSPort オブジェクト、および NSConnection オブジェクトのようなソースの入力を処理します。NSRunLoop オブジェクトは、また NSTimer イベントも処理します。
あなたのアプリケーションは、NSRunLoop オブジェクトを作成または明示的に管理することはできません。各 NSThread オブジェクトは、アプリケーションのメインスレッドを含め、必要に応じて自動的にそれ用に作成した NSRunLoop オブジェクトがあります。現在のスレッドの実行ループにアクセスする必要がある場合は、クラスメソッド currentRunLoop で行ってください。
NSRunloop の観点からは、NSTimer オブジェクトは、"入力" ではなく、それらは特殊な型であり、それらが起動時に戻るための実行ループを引き起こさないことがある事を意味する一つです。
警告: NSRunLoop クラスは、一般的にスレッドセーフであるとは考えられず、そのメソッドは、現在のスレッドのコンテキスト内でのみ呼び出されるべきです。別のスレッドで実行されている NSRunLoop オブジェクトのメソッドを呼び出そうとする事は決してしてはいけません。そうすることは予期しない結果を引き起こすからです。
タスク
実行ループとモードへのアクセス
+ currentRunLoop
現在のスレッドの NSRunLoop オブジェクトを返します。
宣言
<< SWIFT >>
class func currentRunLoop() -> NSRunLoop << OBJECTIVE-C >> + (NSRunLoop *)currentRunLoop
戻り値
現在のスレッドの NSRunLoop オブジェクト。
議論
実行ループがまだスレッドに存在していない場合は、一つが作成され、返されます。
利用可能
OS X 10.0 以降で利用できます。
以下も見よ
currentMode プロパティ
受信者の現在の入力モード。(読み取り専用)
宣言
<< SWIFT >>
var currentMode: String? { get } << OBJECTIVE-C >> @property(readonly, copy) NSString *currentMode
議論
受信者の現在の入力モード。このメソッドは、受信者が稼働している間 だけ、現在の入力モードを返します。それ以外の場合は nil を返します。
現在のモードは、acceptInputForMode:beforeDate: や runMode:beforeDate: のような実行ループを実行するメソッドによって設定されます。
利用可能
OS X 10.0 以降で利用できます。
以下も見よ
+ currentRunLoop– limitDateForMode:
– run
– runUntilDate:
- limitDateForMode:
指定されたモードで実行ループを介して、一つのパスを実行し、次のタイマーが起動するようにスケジュールされた日付を返します。
宣言
<< SWIFT >>
func limitDateForMode(_ mode: String) -> NSDate? << OBJECTIVE-C >> - (NSDate *)limitDateForMode:(NSString *)mode
パラメーター
mode | 検索すべき実行ループモード。カスタムモードを指定するか、実行ループモード に記載されているモードの一つを使用できます。 |
戻り値
次のタイマーが起動するようにスケジュールされた日付、またはこのモードに入力ソースがない場合 nil。
議論
実行ループは即時のタイムアウトに入るため、実行ループはブロックしませんので、何も入力ソースが処理を必要としない場合は、入力を待っています。
利用可能
OS X 10.0 以降で利用できます。
+ mainRunLoop
メインスレッドの実行ループを返します。
宣言
<< SWIFT >>
class func mainRunLoop() -> NSRunLoop << OBJECTIVE-C >> + (NSRunLoop *)mainRunLoop
戻り値
メインスレッドの実行ループを表すオブジェクト。
利用可能
OS X 10.5 以降で利用できます。
- getCFRunLoop
受信者の基本となる CFRunLoop リファレンス オブジェクトを返します。
宣言
<< SWIFT >>
func getCFRunLoop() -> CFRunLoop << OBJECTIVE-C >> - (CFRunLoopRef)getCFRunLoop
戻り値
受信者の基本となる CFRunLoop リファレンス オブジェクト。
議論
Core Foundation の関数呼び出しを使用して、現在の実行ループを構成するために、返された実行ループを使用できます。たとえば、実行ループオブザーバを設定するには、この関数を使用できます。
利用可能
OS X 10.0 以降で利用できます。
タイマーの管理
- addTimer:forMode:
与えられた入力モードに与えられたタイマーを登録します。
宣言
<< SWIFT >>
func addTimer(_ timer: NSTimer, forMode mode: String) << OBJECTIVE-C >> - (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
パラメーター
aTimer | 受信者と登録すべきタイマー。 |
mode | その中に aTimer を追加すべきモード。カスタムモードを指定するか、実行ループモード に記載されているモードの一つを使用できます。 |
議論
複数の入力モードにタイマーを追加できます。指定されたモードで実行中に、受信者は、そのスケジュールされた起動日かその後に起動するためにタイマーをセットします。起動時、タイマーは、指定されたオブジェクト上のセレクタである、その関連したハンドラルーチンを呼び出します。
受信機は aTimer を保持します。それがインストールされているすべての実行ループモードからタイマーを削除するには、タイマーに invalidate メッセージを送信します。
利用可能
OS X 10.0 以降で利用できます。
ポートの管理
- addPort:forMode:
実行ループの指定したモードへの入力ソースとしてポートを追加します。
宣言
<< SWIFT >>
func addPort(_ aPort: NSPort, forMode mode: String) << OBJECTIVE-C >> - (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
パラメーター
aPort | 受信者に追加するべきポート。 |
mode | その中に aPort を追加するべきモード。カスタムモードを指定するか、実行ループモード に記載されているモードの一つを使用できます。 |
議論
このメソッドは、受信者でポートをスケジュールします。複数の入力モードにポートを追加できます。受信者が指定されたモードで実行している場合、ポートの指定ハンドラルーチンに、そのポート宛てのメッセージを送出します。
利用可能
OS X 10.0 以降で利用できます。
以下も見よ
– removePort:forMode:- removePort:forMode:
実行ループの指定された入力モードからポートを削除します。
宣言
<< SWIFT >>
func removePort(_ aPort: NSPort, forMode mode: String) << OBJECTIVE-C >> - (void)removePort:(NSPort *)aPort forMode:(NSString *)mode
パラメーター
aPort | 受信者から削除すべきポート。 |
mode | aPort から削除すべきモード。カスタムモードを指定するか、実行ループモード に記載されているモードの一つを使用できます。 |
議論
複数の入力モードにポートを追加した場合、個別にそれぞれのモードから削除しなければなりません。
利用可能
OS X 10.0 以降で利用できます。
以下も見よ
– addPort:forMode:サーバー・プロセスとして構成
- configureAsServer
(OS X 10.5)旧式です。何もしません。
旧式の声明
OS X v10.5 以降で旧式となりました。別のメソッドは全くありません。
宣言
<< OBJECTIVE-C >>
- (void)configureAsServer
議論
OS X 上では、このメソッドは何もしません。
OS X v10.5 で旧式となりました。
ループの実行
- run
接続されているすべての入力ソースからのデータを処理する時間の間に、永久ループの中に受信者を置きます。
宣言
<< SWIFT >>
func run() << OBJECTIVE-C >> - (void)run
議論
入力ソースまたはタイマーが、実行ループに全く接続されていない場合、このメソッドはすぐに終了します。それ以外の場合は、runMode:beforeDate を繰り返し呼び出して NSDefaultRunLoopMode で受信者を実行します。言い換えれば、このメソッドは、効果的に実行ループの入力ソースおよびタイマーからのデータを処理する無限ループを開始します。
手動で実行ループからすべての既知の入力ソースとタイマーを削除しても、実行ループが終了するのを保証するものではありません。OS X は、受信者のスレッドをターゲットとした要求を処理するために必要に応じて追加の入力ソースをインストールと削除ができます。これらのソースは、したがって実行ループが終了するのを防ぐことができます。
実行ループを終了したい場合は、このメソッドを使用しないでください。代わりに、他の実行メソッドのいずれか一つを使用し、またループ内で、あなた自身の他の任意の条件を確認してください。簡単な例は次のようです。
- BOOL shouldKeepRunning = YES;                // global
- NSRunLoop *theRL = [NSRunLoop currentRunLoop];
- while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
ここで shouldKeepRunning は、プログラムの他のどこかで NO に設定されています。
利用可能
OS X 10.0 以降で利用できます。
以下も見よ
– runUntilDate:- runMode:beforeDate:
一回ループを実行し、与えられた日付まで指定されたモードでの入力をブロックします。
宣言
<< SWIFT >>
func runMode(_ mode: String, beforeDate limitDate: NSDate) -> Bool << OBJECTIVE-C >> - (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate
パラメーター
mode | その中で実行すべきモード。カスタムモードを指定するか、実行ループモード に記載されているモードの一つを使用できます。 |
limitDate | それまでブロックすべき日付。 |
戻り値
実行ループが実行し、入力ソースを処理し、または指定されたタイムアウト値に達した場合 YES。それ以外の場合、実行ループを開始することができなかった場合 NO。
議論
入力ソースまたはタイマーが、実行ループに全く接続されていない場合、このメソッドはすぐに終了し、NO を返します。それ以外の場合、最初の入力ソースが処理されるか limitDate に達したかのいずれかの後、返します。手動で実行ループからすべての既知の入力ソースおよびタイマーを削除するのは、実行ループがすぐに終了することを保証するものではありません。OS X は、受信者のスレッドをターゲットとした要求を処理するために必要に応じて追加の入力ソースをインストールし、削除できます。これらのソースは、したがって、実行ループを終了するのを防ぐことができます。
注意: タイマは、入力ソースとは見なされず、このメソッドが戻るのを待っている間に複数回起動する場合があります。
利用可能
OS X 10.0 以降で利用できます。
以下も見よ
– run– runUntilDate:
– runUntilDate:
接続されているすべての入力ソースからのデータを処理する時間の間に、指定された日付までループを実行します。
宣言
<< SWIFT >>
func runUntilDate(_ limitDate: NSDate) << OBJECTIVE-C >> - (void)runUntilDate:(NSDate *)limitDate
パラメーター
limitDate | それまで実行すべき日付。 |
議論
入力ソースまたはタイマーが、実行ループに全く接続されていない場合、このメソッドはすぐに終了します。それ以外の場合、指定された有効期限まで繰り返し runMode:beforeDate: を呼び出すことによって NSDefaultRunLoopMode で受信者を実行します。
手動で実行ループからすべての既知の入力ソースとタイマーを削除しても、実行ループが終了するのを保証するものではありません。OS X は、受信者のスレッドをターゲットとした要求を処理するために必要に応じて追加の入力ソースをインストールし、削除できます。これらのソースは、したがって実行ループを終了するのを防ぐことができます。
利用可能
OS X 10.0 以降で利用できます。
以下も見よ
- run- acceptInputForMode:beforeDate:
指定されたモードのためのみの入力を受け付け、一回または指定した日付まで、ループを実行します。
宣言
<< SWIFT >>
func acceptInputForMode(_ mode: String, beforeDate limitDate: NSDate) << OBJECTIVE-C >> - (void)acceptInputForMode:(NSString *)mode beforeDate:(NSDate *)limitDate
パラメーター
mode | その中で実行すべきモード。カスタムモードを指定するか、実行ループモード に記載されているモードの一つを使用できます。 |
limitDate | それまで実行すべき日付。 |
議論
入力ソースまたはタイマーが、実行ループに全く接続されていない場合、このメソッドはすぐに終了します。それ以外の場合、一つの入力ソースがメッセージを処理するか指定された時間が経過するとすぐに戻り、一度実行ループを実行します。
注意: タイマーは、入力ソースとは見なされず、このメソッドが返るのを待っている間に複数回起動することがあります。
手動で実行ループからすべての既知の入力ソースとタイマーを削除しても、実行ループが終了するのを保証するものではありません。OS X は、受信者のスレッドをターゲットとした要求を処理するために必要に応じて追加の入力ソースをインストールし、削除できます。これらのソースは、したがって実行ループを終了するのを防ぐことができます。
利用可能
OS X 10.0 以降で利用できます。
以下も見よ
– runMode:beforeDate:メッセージのスケジュールとキャンセル
- performSelector:target:argument:order:modes:
受信者へのメッセージの送信をスケジュールします。
宣言
<< SWIFT >>
func performSelector(_ aSelector: Selector, target target: AnyObject, argument arg: AnyObject?, order order: Int, modes modes: [String]) << OBJECTIVE-C >> - (void)performSelector:(SEL)aSelector target:(id)target argument:(id)anArgument order:(NSUInteger)order modes:(NSArray<NSString *> *)modes
パラメーター
aSelector | 呼び出すメソッドを識別するセレクタ。このメソッドは、重要な戻り値を持つべきではなく、id 型の単一の引数を取る必要があります。 |
target | aSelector のセレクタを定義するオブジェクト。 |
anArgument | それが呼び出されたときメソッドに渡すべき引数。メソッドが、引数を取らない場合は、nil を渡します。 |
order | メッセージの優先度。複数のメッセージがスケジュールされている場合は、下位の値を持つメッセージは、より高位の値を持つメッセージの前に送信されます。 |
modes | メッセージを送信されうる、入力モードの配列。カスタムモードを指定するか、実行ループモード に記載されているモードの一つを使用できます。 |
議論
このメソッドは、次の実行ループ反復の開始時に受信者上で aSelector メッセージを実行するためのタイマーを設定します。タイマーは、modes パラメータで指定されたモードで実行するように構成されます。タイマーが起動すると、スレッドは実行ループからのメッセージをキューから外し、セレクタを実行しようとします。実行ループが、指定されたモードのいずれか一つで実行されている場合、それは成功します。それ以外の場合、実行ループが、これらのモードのいずれか一つになるまで、タイマーは待機します。
aSelector メッセージが送信される前に、このメソッドは戻ります。受信者は、target を保持し、anArgument オブジェクトは、セレクタのタイマーが起動するまで、およびそのクリーンアップの一部としてそれらを解放します。
現在のイベントが処理された後に送信されるように複数のメッセージをしたい場合、およびこれらのメッセージが、特定の順序で送信されていることを確認したい場合は、このメソッドを使用して下さい。
利用可能
OS X 10.0 以降で利用できます。
以下も見よ
– cancelPerformSelector:target:argument:– cancelPerformSelector:target:argument:
以前にスケジュールしたメッセージの送信をキャンセルします。
宣言
<< SWIFT >>
func cancelPerformSelector(_ aSelector: Selector, target target: AnyObject, argument arg: AnyObject?) << OBJECTIVE-C >> - (void)cancelPerformSelector:(SEL)aSelector target:(id)target argument:(id)anArgument
パラメーター
aSelector | 以前に指定されたセレクタ。 |
target | 以前に指定されたターゲット。 |
anArgument | 以前に指定された引数。 |
議論
performSelector:target:argument:order:modes: メソッドを使用して、以前にスケジュールしたメッセージをキャンセルするには、このメソッドを使用できます。キャンセルしたいメッセージを識別するパラメータは、またセレクタがスケジュールされたときに、それらが最初に指定されたものと一致しなければなりません。このメソッドは、実行ループのすべてのモードから実行要求を削除します。
利用可能
OS X 10.0 以降で利用できます。
- cancelPerformSelectorsWithTarget:
与えられたターゲットでスケジュールされたすべての未解決の発注された実行をキャンセルします。
宣言
<< SWIFT >>
func cancelPerformSelectorsWithTarget(_ target: AnyObject) << OBJECTIVE-C >> - (void)cancelPerformSelectorsWithTarget:(id)target
パラメーター
target | 以前に指定されたターゲット。 |
議論
このメソッドは、以前にスケジュールされた、ターゲットに関連するメッセージをキャンセルし、スケジュールされた操作のセレクタと引数を無視します。これは、cancelPerformSelector:target:argument: と対照的であり、セレクタと引数だけでなく、ターゲットと一致する必要があります。このメソッドは、実行ループのすべてのモードからのオブジェクトの実行要求を削除します。
利用可能
OS X 10.2 以降で利用できます。
定数
実行ループモード
NSRunLoop は、以下の実行ループモードを定義します。
宣言
<< SWIFT >>
let NSDefaultRunLoopMode: String let NSRunLoopCommonModes: String << OBJECTIVE-C >> extern NSString* const NSDefaultRunLoopMode; extern NSString* const NSRunLoopCommonModes;
定数
- NSDefaultRunLoopMode
- NSRunLoopCommonModes
NSConnection オブジェクト以外の入力ソースに対処するモード。
これは、最も一般的に使用される実行ループモードです。
OS X v10.0 以降で利用可能。
モードとしてこの値を使用して実行ループに追加されたオブジェクトは、"一般的な" モードのセットのメンバーとして宣言されたすべての実行ループモードによってモニターされています。詳細については CFRunLoopAddCommonMode の説明を参照してください。
OS X v10.5 以降で利用可能。
議論
追加の実行ループモードは、以下を含む、NSConnection と NSApplication によって定義されています。
- NSConnectionReplyMode
- NSModalPanelRunLoopMode
- NSEventTrackingRunLoopMode
次の章