別のスレッドで 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 回動作します。そのランダム。
これは基本的にどのように機能しますか?何が問題なのですか?