//關閉 - 永久關閉
[timer invalidate];
//暫時定時器
[myTimer setFireDate:[NSDate distantFuture]];
//開啟定時器
[myTimer setFireDate:[NSDate distantPast]];
timer不是一種實時的機制,會存在延遲,而且延遲的程度跟當前線程的執行情況有關。
我們通常在主線程中使用NSTimer,有個實際遇到的問題需要注意。當滑動界面時,系統為了更好地處理UI事件和滾動顯示,主線程runloop會暫時停止處理一些其它事件,這時主線程中運行的NSTimer就會被暫停。解決辦法就是改變NSTimer運行的mode(mode可以看成事件類型),不使用缺省的NSDefaultRunLoopMode,而是改用NSRunLoopCommonModes,這樣主線程就會繼續處理NSTimer事件了。具體代碼如下:
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timer:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
前面的例子中我們使用的是一種便利方法,它其實是做了兩件事:首先創建一個timer,然后將該timer添加到當前runloop的default mode中。也就是這個便利方法給我們造成了只要創建了timer就可以生效的錯覺,我們當然可以自己創建timer,然后手動的把它添加到指定runloop的指定mode中去。
NSTimer其實也是一種資源,如果看過多線程變成指引文檔的話,我們會發現所有的source如果要起作用,就得加到runloop中去。
每一個線程都有它自己的runloop,程序的主線程會自動的使runloop生效,但對于我們自己新建的線程,它的runloop是不會自己運行起來,當我們需要使用它的runloop時,就得自己啟動。
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
// 打開下面一行輸出runloop的內容就可以看出,timer卻是已經被添加進去
//NSLog(@"the thread's runloop: %@", [NSRunLoop currentRunLoop]);
// 打開下面一行, 該線程的runloop就會運行起來,timer才會起作用
//[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
http://www.cnblogs.com/smileEvday/archive/2012/12/21/NSTimer.html