0

繰り返し実行したいコードのスニペットがありますが、一時停止および再開する機能があります。これを行うために、必要に応じて停止および開始できるNSTimerを利用しました。

スニペット内で、sleepコマンドを使用して何かが更新されるのを待ちます(0.3秒)。タイマーは0.5秒ごとに起動しています。

理想的なのは、停止と開始の機能を維持し、0.3秒ごとに起動することですが、x秒ごとに起動するように明示的に言う必要はありません。0.5は完全に任意であり、>0.3に設定されています。

タイマーを0.01秒ごとに起動するように設定したが、コード内のsleepコマンドを0.3秒に起動したままにすると、目的の動作が得られますか?または、タイマーはすべてのイベントをバックアップし、予期しない結果が発生しますか(たとえば、停止した後の複数回の起動)?このようにして、0.3秒のスリープを変数にすることができ、0.5を超えるたびにタイマーを変更する必要はありません。

または、この機能を取得するためのより良い方法はありますか?

4

1 に答える 1

1

これに関する最大の問題の1つは、NSTimerが登録されているスレッドに関係なく時間を消費することです。

私にとってほとんどの場合、これは私のメインスレッドです。あなたのメインスレッドの中で寝ることは、私が見る限り悪いことです。

あなたにとってより良いかもしれないいくつかの代替デザイン。

  1. 寝ないで。タイマーによって呼び出されたセレクターに「一時停止しました」チェックを実行させ、そうである場合は早期に終了します。

  2. 一時停止時にNSTimerを無効にし、一時停止を解除するときに再作成します(注:古いタイマーを単に再スケジュールすることはできません)。

  3. 独自のRunLoop、またはスリープ状態での再スケジュールを処理する独自のwhileループを使用してバックグラウンドスレッドを生成します。

1番が私にとって最もきれいに見え、2番がそれに続くので、それらも大まかに私が行う順序です。No.3は実行可能ですが、多くの潜在的な厄介さ(スレッドの問題、クリーンなシャットダウンなど)を引き起こす可能性があります

于 2010-02-03T14:51:28.670 に答える