NSTimer久又、CADisplayLink巫延、GCD 三種定時器的用法

在軟件開發(fā)過程中,我們常常需要在某個時間后執(zhí)行某個方法地消,或者是按照某個周期一直執(zhí)行某個方法炉峰。在這個時候,我們就需要用到定時器脉执。

在iOS中有很多方法完成定時器的任務疼阔,例如 NSTimer、CADisplayLink 和 GCD都可以半夷。

一婆廊、NSTimer

1. 創(chuàng)建方法

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

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

target : 需要執(zhí)行方法的對象否彩。

selector : 需要執(zhí)行的方法

repeats : 是否需要循環(huán)

2. 釋放方法

[timer invalidate];

注意 : 調(diào)用創(chuàng)建方法后,target對象的計數(shù)器會加1嗦随,直到執(zhí)行完畢列荔,自動減1敬尺。如果是循環(huán)執(zhí)行的話,就必須手動關(guān)閉贴浙,否則可以不執(zhí)行釋放方法砂吞。

3. 特點

存在延遲:不管是一次性的還是周期性的timer的實際觸發(fā)事件的時間,都會與所加入的RunLoop和RunLoop Mode有關(guān)崎溃,如果此RunLoop正在執(zhí)行一個連續(xù)性的運算蜻直,timer就會被延時出發(fā)。重復性的timer遇到這種情況袁串,如果延遲超過了一個周期概而,則會在延時結(jié)束后立刻執(zhí)行,并按照之前指定的周期繼續(xù)執(zhí)行囱修。

必須加入Runloop:使用上面的創(chuàng)建方式赎瑰,會自動把timer加入MainRunloop的NSDefaultRunLoopMode中。如果使用以下方式創(chuàng)建定時器破镰,就必須手動加入Runloop:

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

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

二餐曼、CADisplayLink

1. 創(chuàng)建方法

displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];

[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

2. 停止方法

[displayLink invalidate];

displayLink = nil;

當把CADisplayLink對象add到runloop中后,selector就能被周期性調(diào)用鲜漩,類似于重復的NSTimer被啟動了源譬;執(zhí)行invalidate操作時,CADisplayLink對象就會從runloop中移除孕似,selector調(diào)用也隨即停止踩娘,類似于NSTimer的invalidate方法。**

3. 特點:

屏幕刷新時調(diào)用:CADisplayLink是一個能讓我們以和屏幕刷新率同步的頻率將特定的內(nèi)容畫到屏幕上的定時器類鳞青。CADisplayLink以特定模式注冊到runloop后霸饲,每當屏幕顯示內(nèi)容刷新結(jié)束的時候,runloop就會向CADisplayLink指定的target發(fā)送一次指定的selector消息臂拓, CADisplayLink類對應的selector就會被調(diào)用一次。所以通常情況下习寸,按照iOS設備屏幕的刷新率60次/秒

延遲:iOS設備的屏幕刷新頻率是固定的胶惰,CADisplayLink在正常情況下會在每次刷新結(jié)束都被調(diào)用,精確度相當高霞溪。但如果調(diào)用的方法比較耗時孵滞,超過了屏幕刷新周期,就會導致跳過若干次回調(diào)調(diào)用機會鸯匹。

如果CPU過于繁忙坊饶,無法保證屏幕60次/秒的刷新率,就會導致跳過若干次調(diào)用回調(diào)方法的機會殴蓬,跳過次數(shù)取決CPU的忙碌程度匿级。

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

4. 重要屬性

frameInterval

NSInteger類型的值,用來設置間隔多少幀調(diào)用一次selector方法孤页,默認值是1,即每幀都調(diào)用一次行施。

duration

readOnly的CFTimeInterval值允坚,表示兩次屏幕刷新之間的時間間隔蛾号。需要注意的是,該屬性在target的selector被首次調(diào)用以后才會被賦值须教。selector的調(diào)用間隔時間計算方式是:調(diào)用間隔時間 = duration × frameInterval。

三轻腺、GCD

1. 執(zhí)行一次

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

//執(zhí)行事件

});

2. 重復執(zhí)行

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); //每秒執(zhí)行

dispatch_source_set_event_handler(_timer, ^{

//在這里執(zhí)行事件

});

dispatch_resume(_timer);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贬养,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌误算,老刑警劉巖仰美,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儿礼,死亡現(xiàn)場離奇詭異咖杂,居然都是意外死亡,警方通過查閱死者的電腦和手機蚊夫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門诉字,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人知纷,你說我怎么就攤上這事壤圃。” “怎么了琅轧?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵伍绳,是天一觀的道長。 經(jīng)常有香客問我乍桂,道長冲杀,這世上最難降的妖魔是什么效床? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮漠趁,結(jié)果婚禮上扁凛,老公的妹妹穿的比我還像新娘。我一直安慰自己闯传,他們只是感情好谨朝,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著甥绿,像睡著了一般字币。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上共缕,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天洗出,我揣著相機與錄音,去河邊找鬼图谷。 笑死翩活,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的便贵。 我是一名探鬼主播菠镇,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼承璃!你這毒婦竟也來了利耍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤盔粹,失蹤者是張志新(化名)和其女友劉穎隘梨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舷嗡,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡轴猎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了进萄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片税稼。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖垮斯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情只祠,我是刑警寧澤兜蠕,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布熊杨,位于F島的核電站曙旭,受9級特大地震影響桂躏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剂习,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一较沪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尸曼,春花似錦、人聲如沸冤竹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躲株。三九已至,卻和暖如春霜定,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背望浩。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缘回,地道東北人典挑。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像拙寡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肆糕,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容