2013-01-07 63 views
3

可能重複:
NSTimer timerWithTimeInterval: not working的NSTimer不重複預期

在我的應用程序,我有以下設置來運行具有的NSTimer一個動作:在M

。文件:

@implementation MYViewController { 
     NSTimer *aTimer; 
} 

比,當用戶點擊相關按鈕,我有:

- (IBAction)userClick:(id)sender { 
    aTimer = [NSTimer timerWithTimeInterval:1.0 
             target:self 
            selector:@selector(doSomethingWithTimer:) 
            userInfo:nil 
            repeats:YES]; 
    //[aTimer fire]; //NSTimer was fired just once. 
} 

我也有:

-(void)doSomethingWithTimer:(NSTimer*)timer { 
    NSLog(@"something to be done"); 
} 

我希望有在領事一行每秒鐘說「要做的事情」。計時器甚至不會被調用一次。我已經嘗試使用[aTimer fire]發射NSTimer,但它只發射一次,並沒有像我預期的那樣重複。

任何人都可以指導我如何處理這個?

+1

請檢查我的問題http://stackoverflow.com/questions/11058571/nstimer-timerwithtimeinterval-not-working –

回答

8

使用

- (NSTimer *)scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: 

,然後你就不必把它添加到手動運行循環。

+0

我認爲我做了...我錯誤地使用了它(請參閱我的原始問題中的示例代碼)? –

+4

你使用了timerWithTimeInterval,而不是scheduledTimerWithTimeInterval – Andy

+0

哦......愚蠢的我......謝謝,這樣做...... –

1

這裏的問題是範圍。您的aTimer變量需要是一個字段,因此一旦您離開userClick方法,它就不會得到GC'd,例如

NSTimer *timer; 

... 

- (IBAction)userClick:(id)sender { 
    if (timer != nil && [timer isValid]) { 
     [timer invalidate]; 
     timer = nil; 
    } 
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
              target:self 
              selector:@selector(doSomethingWithTimer:) 
              userInfo:nil 
              repeats:YES]; 
} 
+0

哪裏應該定義--- NSTimer *計時器? –

+0

它應該被聲明爲一個類字段。 – James

4

您需要計時器添加到運行循環:

[[NSRunLoop mainRunLoop] addTimer:aTimer forMode:NSDefaultRunLoopMode]; 
+0

我很熟悉這個選項。在閱讀時,我不清楚在我希望NSTimer停止工作時應該做什麼。你有什麼主意嗎? –

+1

在定時器實例上調用invalidate仍然應該訣竅 – Stavash