国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS開發定時器的三種方法分享

2020-07-26 03:11:55
字體:
來源:轉載
供稿:網友

前言

在開發中,很多時候我們需要用到定時器實時刷新某個數值。這個時候我們就需要用到定時器,這里,我為大家推薦三種方法,分別是:NSTimer、CADisplayLink、GCD。接下來我就一一介紹它們的用法。希望能幫到大家。

一、NSTimer(一般用于定時的更新一些非界面上的數據)

1. 創建方法

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO];

     TimerInterval : 執行之前等待的時間。比如設置成1.0,就代表1秒后執行方法

     target : 需要執行方法的對象。

     selector : 需要執行的方法

     repeats : 是否需要循環

2. 釋放方法

[timer invalidate]; 

注意 :

調用創建方法后,target對象的計數器會加1,直到執行完畢,自動減1。如果是循環執行的話,就必須手動關閉,否則可以不執行釋放方法。

3. 特性

存在延遲

不管是一次性的還是周期性的timer的實際觸發事件的時間,都會與所加入的RunLoopRunLoop Mode有關,如果此RunLoop正在執行一個連續性的運算,timer就會被延時出發。重復性的timer遇到這種情況,如果延遲超過了一個周期,則會在延時結束后立刻執行,并按照之前指定的周期繼續執行。

必須加入Runloop

使用上面的創建方式,會自動把timer加入MainRunloopNSDefaultRunLoopMode中。如果使用以下方式創建定時器,就必須手動加入Runloop:

NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

二、CADisplayLink

1. 創建方法

self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)]; [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

 

2. 停止方法

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次/秒

延遲

iOS設備的屏幕刷新頻率是固定的,CADisplayLink在正常情況下會在每次刷新結束都被調用,精確度相當高。但如果調用的方法比較耗時,超過了屏幕刷新周期,就會導致跳過若干次回調調用機會。

如果CPU過于繁忙,無法保證屏幕60次/秒的刷新率,就會導致跳過若干次調用回調方法的機會,跳過次數取決CPU的忙碌程度。

使用場景

從原理上可以看出,CADisplayLink適合做界面的不停重繪,比如視頻播放的時候需要不停地獲取下一幀用于界面渲染。

4. 重要屬性

frameInterval

NSInteger類型的值,用來設置間隔多少幀調用一次selector方法,默認值是1,即每幀都調用一次。

duration

readOnlyCFTimeInterval值,表示兩次屏幕刷新之間的時間間隔。需要注意的是,該屬性在targetselector被首次調用以后才會被賦值。selector的調用間隔時間計算方式是:調用間隔時間 = duration × frameInterval

三、GCD方式

執行一次

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){   //執行事件});

重復執行

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);

總結

GCD的方式,我在網上只能找到這些資料,目前自己還在學習中,以后會更新,以上就是iOS開發定時器的三種方式,希望本文能對各位iOS開發者們有所幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 措勤县| 遵化市| 晋江市| 峨边| 荥阳市| 贵德县| 光泽县| 宁海县| 沾化县| 清流县| 曲靖市| 桐庐县| 荔波县| 天津市| 万盛区| 漾濞| 收藏| 新源县| 格尔木市| 保德县| 青河县| 漠河县| 鄂托克前旗| 来凤县| 垣曲县| 临潭县| 十堰市| 桦川县| 北海市| 永和县| 新野县| 贵州省| 万年县| 富平县| 五常市| 延边| 保定市| 湖南省| 宿迁市| 秦安县| 阳江市|