GCD定時器

GCD定時器要比NSTimer時間準確,為什么?因為NSTimer是受RunLoop模式影響的,但如果設置Track模式,也好使!而GCD是不受RunLoop模式影響的。面試官經常會問什么定時器不準確,怎么辦?

這個不是定時器,這只是延遲調用,執行完后就不做事情了

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"這個不是定時器");
    });

定時器,這里有幾個注意點:

  • dispatch_source_t 是一個OC對象,所有要強引用
  • 雖然是create創建,但這里不用release
  • GCD的時間參數是納秒,所有時間特別準
  • GCD定時器默認是關閉的
#import "ViewController.h"

@interface ViewController ()

/** 定時器對象(不用帶*,因為dispatch_source_t是個類,內部已經包含了*) */
@property (nonatomic, strong) dispatch_source_t timer;

@end

@implementation ViewController

int count = 0;
- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 獲取隊列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    // 創建一個定時器(dispatch_source_t本質是個oc對象)
    self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    
    // 設置定時器的屬性(幾時開始,每隔多久執行任務)
    // GCD的時間參數是納秒(一秒等于十的九次方納秒)
    // dispatch_time(DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC)比當前時間晚3秒
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC));
    uint64_t end = (uint64_t)(2.0 * NSEC_PER_SEC);
    dispatch_source_set_timer(self.timer, start, end, 0);
    
    // 設置回調
    dispatch_source_set_event_handler(self.timer, ^{
        NSLog(@"--------%@", [NSThread currentThread]);
        count ++;
        if (count == 10) {
            // 取消定時器
            dispatch_cancel(self.timer);
            self.timer = nil;
        }
        
    });
    
    // 開啟定時器
    dispatch_resume(self.timer);
    
}

@end

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

推薦閱讀更多精彩內容

  • 提到定時器,NStimer肯定是我們最為熟悉的。 但是NStimer有著很大的缺點,并不準確。 通俗點說,就是它該...
    mengyingguo閱讀 384評論 0 0
  • 大家平時開發中使用最多的定時器應該是NSTimer了,但是,NSTimer同時也存在一些弊端:比如,有時候你要把它...
    憂郁的小碼仔閱讀 1,022評論 0 4
  • NSTimer 定時器易受 RunLoop模式影響導致定時器不準確。 dispatch_source_t time...
    ccme閱讀 170評論 0 0
  • GCD定時器不受RunLoop影響,比NSTimer更精確 //獲得隊列 //dispatch_queue_t q...
    rlqs閱讀 432評論 0 0
  • 上個月,上財政管理課課間休息的時候,老師突然間放了一首陳小春的獨家記憶, 有關于你,絕口不提,沒關系 喜歡你,是我...
    冬天的木頭閱讀 298評論 0 1