iOS定時器NSTimer快速掌握


本文主要講NSTimer。CADisplaylink請猛擊。


NSTimer創建方式有三種:

??:block方式可用為iOS(10.0)。低版本調用會崩潰。

  • 方式一
    [scheduledTimerWithTimeInterval:invocation:repeats:]
    [scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:]
    [scheduledTimerWithTimeInterval:repeats:repeatsblock:]??API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

class method to create the timer and schedule it on the current run loop in the default mode.

Overview:這種方式創建會自動加入到Runloop的timerSource事件中。
注意的坑:

  1. 加入到Runloop的mode為NSDefaultRunLoopMode。而UI響應滾動事件<如滑動TableView>時的mode為UITrackingRunLoopMode。Runloop只會有一種mode運行。如果NSTimer在主線程下,此時如果定時器響應了事件,事件會被跳過。子線程不會響應UITrackingRunLoopMode
    坑2: 如果調用線程為子線程,需要調用[[NSRunLoop currentRunLoop]run]來啟動子線程的Runloop。

  • 方式二
    [timerWithTimeInterval:invocation:repeats: ]
    [timerWithTimeInterval:target:selector:userInfo:repeats: ]
    [timerWithTimeInterval:repeats: block:]??API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

After creating it, you must add the timer to a run loop manually by calling the addTimer:forMode:
method of the corresponding NSRunLoop object.)

Overview:這種方式必需要調用[addTimer:forMode: ]把timer加入到Runloop中。模式可選NSRunLoopCommonModesNSDefaultRunLoopMode
補充知識:NSDefaultRunLoopModeUITrackingRunLoopMode都具備commonMode屬性。它們會自動加入NSRunLoopCommonModes中的modeItem事件。
So:NSRunLoopCommonModes不會受其他mode影響,一般選用這種模式。


  • 方式三
    [- initWithFireDate:interval:target:selector:userInfo:repeats:]
    [- initWithFireDate:interval:repeats:block:] ??API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

After creating it, you must add the timer to a run loop manually by calling the addTimer:forMode:
method of the corresponding NSRunLoop object)

Overview::這種方式必需要調用[addTimer:forMode: ]把timer加入到Runloop中。模式選擇參考方式二。
special:

  1. 這是-號方法。
  2. 可以指定FireDate。即啟動定時器時間。

匯總:

  1. 如果你的定時器是repeats = YES,那要記得在不需要timer的時候調用-invalidate來釋放定時器。
  2. 需要注意定時器所在的線程。timer不執行,看這點。
  3. 使用定時器需要注意創建方式,是否需要手動加入Runloop。timer不執行,看這點。
  4. 需要注意加入Runloop的mode。如果timer某次未執行,看這點。
  5. 如果你的token用這個,一定要注意,不然token失效就GG了。

Write In Last:
本文用到了一些Runloop知識。其實timer和runloop關系很大。推薦一個特別好的博文。記得點贊哦??。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 基本概念 進程 進程是指在系統中正在運行的一個應用程序,而且每個進程之間是獨立的,它們都運行在其專用且受保護的內存...
    小楓123閱讀 927評論 0 1
  • 一、什么是NSRunLoop NSRunLoop是消息機制的處理模式 NSRunLoop的作用在于有事情做的時候使...
    呦釋原點閱讀 679評論 0 2
  • 一、什么是runloop 字面意思是“消息循環、運行循環”。它不是線程,但它和線程息息相關。一般來講,一個線程一次...
    WeiHing閱讀 8,177評論 11 111
  • ios 常用的定時器有三種:NSTime,CADisplayLink和GCD。 NsTimer // 參數:Int...
    殿小七閱讀 862評論 0 2
  • 一、什么是RunLoop 基本作用: 保持程序的持續運行; 處理App中的各種事件(比如觸摸事件、定時器事件、Se...
    magic_pill閱讀 921評論 0 0