2013-01-07 131 views
0

我希望這是一個簡單的修復,你告訴我。NSTimer不按預期運行

我所擁有的是類型爲NSTimer的類IVAR *定時器。當執行IBAction爲,一種方法被稱爲包含此代碼:

if (timer) timer = nil; 
timer = [NSTimer timerWithTimeInterval:0.2 target:self selector:@selector(removeOverlay) userInfo:nil repeats:NO]; 

在同一個班,我有一個方法:

- (void)removeOverlay { 
... 
} 

這的時間間隔後,不會觸發。 2秒。

你可能知道問題在這裏嗎?

+0

獲取調用多次而不是o NCE? –

+0

它只被調用一次 – achi

+0

或使用[timer fire]; –

回答

2
  1. 確保timerNSTimer實例未同時發佈。
  2. removeOverlay看起來像它更新了一些用戶界面。請確保你在主線程中調用它。
  3. removeLayout方法中放置斷點以查看它是否觸發。
  4. 您不計劃計時器。所述timerWithTimeIntervalscheduledTimerWithTimeInterval

要在主線程執行的代碼替換(允許UI更新):

- (void)removeOverlay { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    // update ui 
    }); 
} 

更多關於Grand Central Dispatch (GCD)

+0

它確實做用戶界面,但我知道它不是因爲NSLog – achi

+0

調用既沒有斷點也沒有發射NSLog – achi

+0

我改進了回答。 「你沒有安排計時器,用scheduledTimerWithTimeInterval替換timerWithTimeInterval」 –

1

你需要

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

的定時器工作放置在運行循環的相應點的電話。

+0

hm我以前用過它們,沒有問題,也沒有NSRunLoop – achi

+0

@EliGregory - 你可能使用了'scheduledTimer ...' –

0

如果只被調用一次,我會用[self performSelector:@selector(removeOverlay) afterDelay:(seconds you want to delay the use the method removeOverlay)];

+0

什麼類包含該方法?它似乎不是UIViewController的一個類,因爲我不能稱它爲 – achi

+0

它實際上是一個UIViewController – pau

+0

它是否被棄用?當我嘗試運行它時,出現錯誤。 (這將是真棒,如果是這樣,我想它有相當多的用途) – achi

1

由於沒有一個提到這個問題,替代添加計時器到運行循環是使用火法:

[timer fire]; 
+1

我也試過這個,文檔聲稱這是一個*額外的*火,並不是計時器的實際開始 – achi

+1

我還沒有閱讀任何這些在文檔中。如果您使用scheduledTimerWithTimerInterval創建了定時器,那麼可能會引發額外的火災。 –