iOS幾種定時器的使用方法

iOS里常常會用到一些定時器的地方,這里有這么幾種方法可以使用:
NSTimer、CADisplayLink 和 GCD

一、NSTimer####

NSTimer是我們在寫iOS定時器的時候比較常用的一種,關于NSTimer有幾點需要注意的,一是內存泄露問題,二是延時問題。關于這些這些問題的解決和NSTimer的使用在NSTimer需要注意的地方中有寫。

二、CADisplayLink####

  • 創建方法

    @interface ViewController ()
    @property (nonatomic) CADisplayLink *displayLink;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
          [super viewDidLoad];
          _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
          _displayLink.frameInterval = 60;
          [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    }
    
  • 停止方法

[displayLink invalidate];
displayLink = nil;

當把CADisplayLink對象add到runloop中后,selector就能被周期性調用,類似于重復的NSTimer被啟動了;執行invalidate操作時,CADisplayLink對象就會從runloop中移除,selector調用也隨即停止,類似于NSTimer的invalidate方法。

  • 特點

    屏幕刷新時調用:CADisplayLink是一個能讓我們以和屏幕刷新率同步的頻率將特定的內容畫到屏幕上的定時器類。CADisplayLink以特定模式注冊到runloop后,每當屏幕顯示內容刷新結束的時候,runloop就會向CADisplayLink指定的target發送一次指定的selector消息, CADisplayLink類對應的selector就會被調用一次。所以通常情況下,按照iOS設備屏幕的刷新率60次/秒

    延遲:iOS設備的屏幕刷新頻率是固定的,CADisplayLink在正常情況下會在每次刷新結束都被調用,精確度相當高。但如果調用的方法比較耗時,超過了屏幕刷新周期,就會導致跳過若干次回調調用機會。 如果CPU過于繁忙,無法保證屏幕60次/秒的刷新率,就會導致跳過若干次調用回調方法的機會,跳過次數取決CPU的忙碌程度。

使用場景:從原理上可以看出,CADisplayLink適合做界面的不停重繪,比如視頻播放的時候需要不停地獲取下一幀用于界面渲染。

  • 重要屬性

frameInterval
NSInteger類型的值,用來設置間隔多少幀調用一次selector方法,默認值是1,即每幀都調用一次。

duration
readOnly的CFTimeInterval值,表示兩次屏幕刷新之間的時間間隔。需要注意的是,該屬性在target的selector被首次調用以后才會被賦值。selector的調用間隔時間計算方式是:調用間隔時間 = duration × frameInterval。

三、GCD####

  • 創建方法

      @interface ViewController ()
    
      @property (nonatomic) dispatch_source_t timer;
    
      @end
    
      @implementation ViewController
    
      - (void)viewDidLoad {
          [super viewDidLoad];
    
          double delayInSeconds = 1.0;
          _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
          dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC, 0.0);
          dispatch_source_set_event_handler(_timer, ^{
              NSLog(@"timer date 1== %@",[NSDate date]);
          });
          dispatch_resume(_timer);
      }
    
  • 停止方法

    dispatch_source_cancel(self.timer);
    dispatch_release(self.timer);
    self.source = nil;
    

四、github上一些關于定時器的項目####

參考自####

NSTimer、CADisplayLink、GCD 三種定時器的用法

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

推薦閱讀更多精彩內容

  • 在軟件開發過程中,我們常常需要在某個時間后執行某個方法,或者是按照某個周期一直執行某個方法。在這個時候,我們就需要...
    誰遇而安閱讀 20,966評論 2 20
  • 一. NSTimer NSTimer的初始化方法有以下幾種: 會自動啟動, 并加入* MainRunloop*的*...
    codeshow閱讀 526評論 0 0
  • iOS中定時器有三種,分別是NSTimer、CADisplayLink、dispatch_source,下面就分別...
    HK_Hank閱讀 12,468評論 9 25
  • 調用一次計時器方法: [cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片 myTime...
    3ad997c871e9閱讀 733評論 0 1
  • 回顧:(多線程的執行原理 )同一時間, CPU只能運行一條線程, 只有一條線程在工作, 多線程的原理其實是CPU在...
    Brice_Zhao閱讀 1,019評論 0 1