1

performSelector:withObject:afterDelay: に 1 秒未満の時間を渡すことはできますが、タイマーは 1 秒未満の遅延に対してできるだけ早く起動するようです。たとえば、遅延を 100 ミリ秒 (0.100) または 10 ミリ秒 (0.010) に設定した場合でも、タイマーは 2 または 3 ミリ秒で起動します。これは既知の制限ですか?

performSelection:withObject:afterDelay: の場合、遅延に関するドキュメントには次のように記載されています。

delay — メッセージが送信されるまでの最小時間。遅延を 0 に指定しても、セレクターがすぐに実行されるとは限りません。セレクターは引き続きスレッドの実行ループでキューに入れられ、できるだけ早く実行されます。

これを NSTimer と比較してください。ドキュメントには次のように記載されています。

seconds — タイマーの発火間の秒数。秒が 0.0 以下の場合、このメソッドは代わりに 0.1 ミリ秒の負でない値を選択します。

performSelector:withObject:afterDelay: は、負の値が指定されたときに NSTimer の秒設定と同じように遅延設定を使用しているようです。

誰でもそれが正しいことを確認できますか?

4

2 に答える 2

1

フォローアップとして、次のように遅延performSelector:withObject:afterDelay:を渡していたため、それが正常に機能していること、および1秒未満の間隔でトリガーされていないことを発見しました。int

int delay = 0.025; // 25 msec
[self performSelector:@selector(blahBlah:) withObject:nil afterDelay:delay];

OK、悪い!ただし、これは別の観察につながります —明示的なキャストなしでadoubleを anに変換すると、コンパイラは「精度の損失」を報告したと思います。intただし、そうではありません。注意してください!

于 2013-06-29T01:08:37.323 に答える
0

performSelector:withObject:afterDelay: を使用して遅延を 100 ミリ秒 (0.100) に設定すると、2 ミリ秒または 3 ミリ秒で起動されません。100 ミリ秒後に実行ループでスケジュールされ、実行ループが実行される機会が得られるまで待機します。したがって、102 ミリ秒または 103 ミリ秒後に起動される可能性があります。

于 2013-06-28T19:15:17.937 に答える