1

このトピックに関する多くの質問を認識していますが、私自身が以前に質問したことがありますが、現在、私の問題はスレッド部分に関連しているようです。私は次の2つの方法を持っています。

-(void) restartTimer {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1. 
                                             target:self
                                           selector:@selector(dim) 
                                           userInfo:nil 
                                            repeats:YES];
    time = 31;
    NSLog(@"calling restart timer");
    [self performSelectorOnMainThread:@selector(timerImageUpdate) withObject:nil waitUntilDone:NO];

    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];

    [pool drain];

}

-(void) resumeTimer {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1. 
                                             target:self
                                           selector:@selector(dim) 
                                           userInfo:nil 
                                            repeats:YES];
    NSLog(@"calling resume timer");

    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];

    [pool drain];

}

ゲームの開始時に restartTimer 関数が呼び出されます。これは正常に機能し、タイマーは薄暗いセレクターを適切に起動します。この問題は、ユーザーがスキップ ボタンを続けてクリックすると発生します。[スキップ] MKMapView を更新し、デリゲート メソッド mapdidfinishloading で次のものが呼び出されます。
これが発生すると、いくつかのタイマーが作成されているように見えるため、dim 関数が頻繁に呼び出され、単一のタイマーが非常に高速に実行されているように見えますか? セカンダリスレッドを使用してタイマーを開始および再起動する最良の方法は何ですか? この問題は、スキップ ボタンを繰り返しすばやく押した場合にのみ発生するように見えますが、時々押すと問題なく動作することに注意してください。

誰にもアイデアはありますか?どうもありがとう

ジュール

4

1 に答える 1

0

bool を使用して、タイマーが実行されているかどうかを知ることができます。タイマーを開始するときは true に設定し、タイマーを停止するときは false に設定します。再開タイマー関数が呼び出されると、この変数をチェックし、真の場合は新しいタイマーを開始しません。

もう 1 つの解決策は、ユーザーによるボタンの操作を制限することです。ボタンが押されると、一時的に非アクティブになります。

于 2010-07-01T09:31:06.460 に答える