定時器是開發中常用一中工具,定時器常用的爲NSTimer,CADisplayLink以及GCD定時器
- NSTimer
NSTimer也分爲兩種情況- 一個方法是自動加入當前線程的RunLoop中,並且運行模式爲NSDefaultRunLoopMode模式,不需要手動開啓,代碼如下
注意:如果想要在有scrollView拖動的情況下定時器也能使用必須手動切換其運行模式到NSRunLoopCommonModes/* 第一個參數:時間間隔 第二個參數:方法的調用者 第三個參數:執行的方法 最後一個參數:是否需要重複 */ NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(demo1) userInfo:nil repeats:YES];
//切換到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];
- 一個方法是自動加入當前線程的RunLoop中,並且運行模式爲NSDefaultRunLoopMode模式,不需要手動開啓,代碼如下
-
CADisplayLink
這個定時器和NSTimer有很多相同之處,它也是依賴於RunLoop運行的,唯一的區別是,它的頻率是60Hz,創建方式如下:CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(demo)]; [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
以下這幅圖中可以看出CADisplayLink的執行頻率
CADisplayLink的調用頻率圖:
NSTimer的調用頻率圖:
-
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
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。
原文鏈接:http://www.jianshu.com/p/0194a0866872
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。