2011-04-06 36 views
4

我使用以下代碼開始的重複的NSTimer 4秒延遲後:停止一個「performSelector afterDelay」之前它觸發

- (void)viewDidLoad { 
    [self performSelector:@selector(startTimer) withObject:self afterDelay:4]; 
} 
- (void)startTimer { 
    NSTimer *mytimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(doSomething) userInfo:nil repeats:YES]; 
} 
- (void)doSomething { 
    NSLog(@"What up!"); 
} 

問題是我可能需要從被調用的4秒之前是取消startTimer所向上。有沒有辦法做到這一點?我實際上更喜歡不首先使用performSelector(看起來很亂)。如果僅具有的NSTimer沿着此線的東西...

的NSTimer * mytimer = [的NSTimer scheduledTimerWithTimeInterval:1.0 afterDelay:4.0目標:自 選擇器:@selector(doSomething的) USERINFO:無重複:YES] ;

...那將是完美的,因爲我可以調用如下

[myTimer無效]。

任何幫助或尖端非常感謝=)

P.S.我在NSObject類的引用中發現了一個名爲cancelPreviousPerformRequestsWithTarget的東西。似乎並不是我可以從該代碼運行的位置調用的方法。如果這是回到正確的軌道,歡迎您的反饋!

+2

可能重複[停止一個performSelector:從正在執行(http://stackoverflow.com/questions/5498071/stopping-a-執行選擇器從正在執行) – Vladimir 2011-04-06 08:17:00

+3

你可以使用非重複計時器來觸發重複計時器 – 2011-04-06 08:28:00

+0

不錯,尼克,一個更清潔的選項。謝謝!可惜我不能將你的評論標記爲答案。我將不得不標記下一個最接近的 – Timbo 2011-04-06 10:12:45

回答

1

[myTimer invalidate]不起作用? 只需跟蹤班級中的對象或例如集中存儲中的對象。 如果你這樣做,你可以從任何你想要的地方訪問你的計時器,並在需要時使其無效

+0

它確實有效,對於一個計時器,現在我使用單獨的計時器來計算啓動延遲並重複選擇器的所有優點。 – Timbo 2011-04-06 10:14:01

0

使用NSTimer修復問題。

self.autoTimer = [NSTimer timerWithTimeInterval:3.0 target:self 
selector:@selector(connectionTimeout:) userInfo:nil repeats:NO]; 
[[NSRunLoop currentRunLoop] addTimer:autoTimer 
forMode:NSDefaultRunLoopMode]; 

和打電話的時候,你要停止計時器

[self.autoTimer invalidate]; 

self.autoTimer = nil;