標籤:
在軟體開發過程中,我們常常需要在某個時間後執行某個方法,或者是按照某個周期一直執行某個方法。在這個時候,我們就需要用到定時器。
一、NSTimer
1. 建立方法
| 1 |
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO]; |
2. 釋放方法
調用建立方法後,target對象的計數器會加1,直到執行完畢,自動減1。如果是迴圈執行的話,就必須手動關閉,否則可以不執行釋放方法。
3. 特性
不 管是一次性的還是周期性的timer的實際觸發事件的時間,都會與所加入的RunLoop和RunLoop Mode有關,如果此RunLoop正在執行一個連續性的運算,timer就會被延時出發。重複性的timer遇到這種情況,如果延遲超過了一個周期,則 會在延時結束後立刻執行,並按照之前指定的周期繼續執行。
使用上面的建立方式,會自動把timer加入MainRunloop的NSDefaultRunLoopMode中。如果使用以下方式建立定時器,就必須手動加入Runloop:
| 12 |
NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; |
二、CADisplayLink
1. 建立方法
| 1234 |
```objc self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)]; [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];``` |
2. 停止方法
| 12345 |
```objc [self.displayLink invalidate]; self.displayLink = nil;``` **當把CADisplayLink對象add到runloop中後,selector就能被周期性調用,類似於重複的NSTimer被啟動了;執行invalidate操作時,CADisplayLink對象就會從runloop中移除,selector調用也隨即停止,類似於NSTimer的invalidate方法。** |
3. 特性
螢幕重新整理時調用
CADisplayLink 是一個能讓我們以和螢幕重新整理率同步的頻率將特定的內容畫到螢幕上的定時器類。CADisplayLink以特定模式註冊到runloop後,每當螢幕顯示 內容重新整理結束的時候,runloop就會向CADisplayLink指定的target發送一次指定的selector訊息, CADisplayLink類對應的selector就會被調用一次。所以通常情況下,按照iOS裝置螢幕的重新整理率60次/秒
延遲
使用情境
從原理上可以看出,CADisplayLink適合做介面的不停重繪,比如視頻播放的時候需要不停地擷取下一幀用於介面渲染。
4. 重要屬性
三、GCD方式
| 12345 |
double delayInSeconds = 2.0;dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ //執行事件}); |
| 12345678 |
NSTimeInterval period = 1.0; //設定時間間隔dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //每秒執行dispatch_source_set_event_handler(_timer, ^{ //在這裡執行事件});dispatch_resume(_timer); |
iOS中幾種定時器