2012-01-17 8 views
1

イメージを常に更新するためにperformSelectorを0.1秒ごとに実行するメソッドがあります。UIViewがperformSelectorを中断するのを止める方法

-(void)setNeeds 

[mag setNeedsDisplay]; 
[vc setNeedsDisplay]; 
[na setNeedsDisplay]; 
[wave setNeedsDisplay]; 
[mon setNeedsDisplay]; 

[self performSelector:@selector(setNeeds) 
      withObject:NULL 
      afterDelay:.01]; 

通常のユーザー操作が行われている場合は、この情報はうまく更新されます。ただし、ユーザーがUIViewPickerで値をスライドさせると、すべての更新が対話が停止するまで一時停止されます。リピート時に設定されたNSTimerオブジェクトでも同じことが起こります。

私は、より一貫性のあるアクションを実行することを望んでいますが、この問題の解決策も偉大なものになります。

答えて

0

scheduledTimerWith...で作成されたNSTimerがユーザーの操作中に一時停止する可能性があるため、これはよくある質問です。 Here is a similar question。可能であれば、performSelector:..afterDelay:..メソッドはNSTimerを内部的に使用します。基本的には、scheduledTimerWith...またはperformSelector:..afterDelay:..を使用すると、ユーザーのアプリケーションとやりとりしている間に実行ループが中止されるNSDefaultRunLoopModeの実行ループでタイマーがスケジュールされます。解決策は、そのようなCommonModesのための実行ループで自分をタイマーをスケジュールすることです:

timer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(setNeeds) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

あなたは、あなたがperformSelector:withObject:afterDelay:inModes:機能を使用することができ、この機能のためにNSTimer、独自の管理に反対している場合。最後の引数は、実行ループモードの配列で、NSRunLoopCommonModesとすることができます。ニーズが第二のすべての1 /第百を表示するようにすべてをマーキング

0

は表示のみのビューにメイン実行ループを次のパス上に描画する機会を与える必要として何かをマークし、あなたに100FPSのフレームレートを与えることはありません。

描画が第二の1/10を取る場合は、あなたが10FPSを取得します...

プラス、このアプローチが呼ばれるようにsetNeedsを必要とし、そのコール・サイクルが何らかの形で中断された場合、それは、あなたを再開することはありませんNSTimer + scheduledTimer ...コールを使用して定期的なタイマーを作成する必要があります。

関連する問題