iOS 中幾種常用的定時器

定時器是開發中常用一中工具,定時器常用的爲NSTimer,CADisplayLink以及GCD定時器

  • NSTimer
    NSTimer也分爲兩種情況
    • 一個方法是自動加入當前線程的RunLoop中,並且運行模式爲NSDefaultRunLoopMode模式,不需要手動開啓,代碼如下
      /*
      第一個參數:時間間隔
      第二個參數:方法的調用者
      第三個參數:執行的方法
      最後一個參數:是否需要重複
      */
      NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(demo1) userInfo:nil repeats:YES];
      注意:如果想要在有scrollView拖動的情況下定時器也能使用必須手動切換其運行模式到NSRunLoopCommonModes
      //切換到NSRunLoopCommonModes
      [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
    • 另外一種創建方式必須要手動把NSTimer對象加入到對應的RunLoop中,並且制定運行模式纔可以運行,代碼如下:
      /*
       第一個參數:時間間隔
       第二個參數:方法的調用者
       第三個參數:執行的方法
       最後一個參數:是否需要重複
       */
      NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(demo) userInfo:nil repeats:YES];
      [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
  • CADisplayLink
    這個定時器和NSTimer有很多相同之處,它也是依賴於RunLoop運行的,唯一的區別是,它的頻率是60Hz,創建方式如下:

    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(demo)];
      [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

    以下這幅圖中可以看出CADisplayLink的執行頻率
    CADisplayLink的調用頻率圖:


    Snip20160717_6.png


    NSTimer的調用頻率圖:


    Snip20160717_7.png
  • GCD定時器
    CGD定時器就和NSTimer以及CADisplayLink有很多不同之處了

    • 首先,CGD定時器是獨立於RunLoop執行的
    • 其次,CGD定時器的最小時間間隔單位是納秒(1秒=10的10次方納秒)
    • 然後,CGD定時器的創建和使用是一套純C語言庫,用起來相對來講麻煩一下
      話不多說直接上代碼
      //創建
      dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0,queue);
      //這裏必須有一個強指針指向,因爲GCD定時器本質還是一個OC對象
      self.timer = timer;
      //設置定時器開始時間,這裏的時間單位是納秒
      dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW,2 * NSEC_PER_SEC);
      //設置定時器
      dispatch_source_set_timer(timer,startTimer,(int64_t)(2 * NSEC_PER_SEC),0);
      //設置定時器所做的事情,block回調
      dispatch_source_set_event_handler(timer,^{
      //定時器要做的事情
      });
      //CGD定時器默認是暫停的,需要手動開啓
      dispatch_resume(timer);
      //定時器的關閉
      dipatch_cancel(self.timer);
      self.timer = nil

關於常用的定時器就介紹這麼多,希望對大家有所幫助



文/落雪無痕_t(簡書作者)
原文鏈接:http://www.jianshu.com/p/0194a0866872
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章