定時器是開發中常用一中工具,定時器常用的為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
關于常用的定時器就介紹這么多,希望對大家有所幫助
作者:胥鴻儒