NSTimer 的使用
為什么會寫NSTimer呢?
原因很簡單, 這里有坑!
NSTimer 使用的順序
- 創(chuàng)建NSTimer
- 銷毀NSTimer
- NSTimer和Runloop
- 創(chuàng)建NSTimer
NSTimer有三種創(chuàng)建的方式 :
這三種創(chuàng)建方式在現(xiàn)實工作使用中的使用頻率是依次遞增的.
- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
我們先從使用最多的scheduledTimer講起, 當(dāng)使用scheduledTimer這個方法的時候, 我們不僅僅是創(chuàng)建了一個NSTimer的對象, 還將這個定時器的對象加入到了當(dāng)前的運行環(huán)runloop中.
NSTimer對象只有被加入到了當(dāng)前的runloop中才會被執(zhí)行
所以當(dāng)你使用前兩個方法的時候, 需要手動的將NSTimer對象加入到runloop中
銷毀NSTimer
要在viewWillDisappear的時候?qū)?chuàng)建的NSTimer對象銷毀掉
- (void)viewWillDisappear:(BOOL)animated {super viewWillDisappear:animated;
_timer invalidate;_timer = nil;
`}NSTimer 和 Runloop
runloop會運行在不同的mode, 簡單來說有以下兩種mode
? NSDefaultRunLoopMode, 默認(rèn)的mode
? UITrackingRunLoopMode, 當(dāng)處理UI滾動操作時的mode
通常情況下NSDefaultRunLoopMode和UITrackingRunLoopMode都已經(jīng)被加入到了common modes集合中, 所以不論runloop運行在哪種mode下, NSTimer都會被及時觸發(fā). 所以我們在加入到當(dāng)前線程
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
時已經(jīng)是加入了兩種mode了, 此時你在滾動UI的時候是可以處理定時器的了