之前對定時器的使用有誤區,所以特地研究了一下,這裏也跟大家分享一下:
1、要使用一個定時器首先要定義一個定時器:
@property (strong, nonatomic) NSTimer *myTimer;//定時器
2、然後初始化,這裏初始化有兩種方式:
第一種:
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
第二種:
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti
target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
這兩種初始化方式是有區別的,假如你用第一種就要自己將這個計時器加入主循環中,否則不會調用selector後面的方法,但是第二種就是在初始化一個定時器的同時直接將這個定時器加入主循環,所以並不用自己添加,下面舉例:
第一種示例:
//初始化定時器
_myTimer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(startLocation) userInfo:nil repeats:YES];
在初始化之後並不會調用,在添加下面這句將定時器假如主循環中的代碼後5秒纔開始調用startLocation方法,又要repeats:YES,所以這裏是循環調用,假如NO只調用一次。
//將定時器假如主循環中
[[NSRunLoop mainRunLoop] addTimer:_myTimer forMode:NSDefaultRunLoopMode];
第二種示例:
//初始化定時器
_myTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(startLocation) userInfo:nil repeats:YES];
這種方式就是該定時器將在初始化時指定的timeInterval秒後自動觸發(也就是在這句代碼寫完的後5秒循環調用startLocation方法)。
3、假如要立即開始:
//開啓定時器
[_myTimer setFireDate:[NSDate distantPast]];
在重複執行的定時器中調用此方法後立即觸發該定時器,但不會中斷其之前的執行計劃;(也就是在立即調用後,5秒之後又會調用啓動定位的方法)
在不重複執行的定時器中調用此方法,立即觸發後,就會使這個定時器失效。(立即調用完就結束)
4、要想實現:先停止,然後再某種情況下再次開啓運行timer,可以使用下面的方法:
首先關閉定時器不能使用上面的方法,應該使用下面的方法:
關閉定時器:
//關閉定時器
[_myTimer setFireDate:[NSDate distantFuture]];
5、取消定時器:
//取消定時器
[_myTimer invalidate];
_myTimer = nil;
停止timer的運行,這個是永久的停止,這也是唯一一個可以將計時器從runloop中移出的方法。這裏要注意一下:
NSTimer可以精確到50-100毫秒.
NSTimer不是絕對準確的,而且中間耗時或阻塞錯過下一個執行點,那麼就pass繼續執行其他的計劃.
這些是我在使用定時器的一些總結,希望對大家有所幫助