2

別のスレッドで NSTimer をスケジュールしようとしていますが、これが私がやっている方法です。

-(void) startSpinner {
#ifdef DEBUG_MODE
    NSLog(@"Starting Spinner...");
#endif
    self.spinnerThread = [[[NSThread alloc] initWithTarget:self selector:@selector(scheduleSpinner) object:nil] autorelease];
    [spinnerThread start];
}

-(void) scheduleSpinner {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSTimer *_spinTimer = [NSTimer scheduledTimerWithTimeInterval:SPIN_FIRE_INTERVAL target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:_spinTimer forMode:NSRunLoopCommonModes];
    [runLoop addTimer:_spinTimer forMode:UITrackingRunLoopMode];
    [runLoop run];

    [pool release];
}

timerFireMethod はスピナーを回転させ、ボタンが押されると (停止ボタン)、タイマーを無効にしてこのメ​​ソッドのスレッドを終了します。スピンボタンが押された場合、ここでポーリングを行います。

問題は、私の timerFireMethod が初めて適切に呼び出されることです。スピナーが初めて回転します。しかし、スピナーを停止して再度開始すると、スピナーが回転しません。ログには、「startSpinner」メソッドが 2 回呼び出されたが、「timerFireMethod」メソッドが呼び出されなかったことが示されています。

さらに悪いことに、スピナーはシミュレーターで 5 ~ 6 回、2g デバイスで 1 回、最新の iPod で 4 ~ 5 回動作します。そのランダム。

これは基本的にどのように機能しますか?何が問題なのですか?

4

1 に答える 1

0

インスタンスNSTimer変数をクラス変数にします。無効にする場合はnilその直後に設定してください。

于 2011-05-24T13:10:52.690 に答える