2010-07-01 64 views
1

我知道關於這個主題的許多問題,因爲我以前曾問過一個問題,現在我的問題似乎與線程部分更相關。我有以下2種方法。Threaded NSTimer

-(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函數。這工作正常,計時器很好地啓動昏暗選擇器。當用戶快速連續點擊我的跳過按鈕時會出現問題。 [skip]更新一個MKMapView,並在委託方法mapdidfinishloading中加入下面的命令: [NSThread detachNewThreadSelector:@selector(restartTimer)toTarget:self withObject:nil];
當發生這種情況時,似乎有幾個定時器被創建,因此我的調光功能被調用的太頻繁,給出了運行速度非常快的單個定時器的外觀?使用輔助線程啓動和重新啓動計時器的最佳方法是什麼?注意,這個問題似乎只在重複快速按下跳過按鈕時纔會發生,而如果只是一次又一次地按下,它可以正常工作嗎?

任何人有任何想法?非常感謝

回答

0

您可以使用布爾要知道,如果你有一個計時器運行與否。當您啓動計時器時,將其設置爲true,當您停止計時器時,將其設置爲false。當恢復計時器功能被調用時,你檢查這個變量,如果它是真的,你不會啓動一個新的計時器。

另一種解決方案是限制用戶與按鈕的交互。如果該按鈕被按下,您將其暫時停用。

+0

感謝您的幫助。這可能工作,但我真正的問題是爲什麼計時器不失效? Timer是一個類屬性,我在輔助線程上創建它。當涉及到無效這是在主線程完成,這可能是原因? – Jules 2010-07-01 09:36:32