NSTimer的使用

NSTimer 的使用

為什么會寫NSTimer呢?

原因很簡單, 這里有坑!

NSTimer 使用的順序
  1. 創(chuàng)建NSTimer
  2. 銷毀NSTimer
  3. NSTimer和Runloop
  • 創(chuàng)建NSTimer
    NSTimer有三種創(chuàng)建的方式 :
    這三種創(chuàng)建方式在現(xiàn)實工作使用中的使用頻率是依次遞增的.
  1. - (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
  2. + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
  3. + (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的時候是可以處理定時器的了

以上

cool

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容