定時(shí)任務(wù)

在軟件開發(fā)過程中凌节,我們常常需要在某個(gè)時(shí)間后執(zhí)行某個(gè)方法钦听,或者是按照某個(gè)周期一直執(zhí)行某個(gè)方法。在這個(gè)時(shí)候倍奢,我們就需要用到定時(shí)器朴上。

在iOS中有很多方法完成定時(shí)器的任務(wù),例如 NSTimer卒煞、CADisplayLink 和 GCD都可以痪宰。
一、NSTimer

  1. 創(chuàng)建方法
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO];
TimerInterval : 執(zhí)行之前等待的時(shí)間畔裕。比如設(shè)置成1.0衣撬,就代表1秒后執(zhí)行方法
target : 需要執(zhí)行方法的對(duì)象。
selector : 需要執(zhí)行的方法
repeats : 是否需要循環(huán)
  1. 釋放方法

    [timer invalidate];

    注意 : 調(diào)用創(chuàng)建方法后扮饶,target對(duì)象的計(jì)數(shù)器會(huì)加1具练,直到執(zhí)行完畢,自動(dòng)減1甜无。如果是循環(huán)執(zhí)行的話扛点,就必須手動(dòng)關(guān)閉,否則可以不執(zhí)行釋放方法毫蚓。

  1. 特點(diǎn)

    存在延遲:不管是一次性的還是周期性的timer的實(shí)際觸發(fā)事件的時(shí)間占键,都會(huì)與所加入的RunLoop和RunLoop Mode有關(guān),如果此RunLoop正在執(zhí)行一個(gè)連續(xù)性的運(yùn)算元潘,timer就會(huì)被延時(shí)出發(fā)畔乙。重復(fù)性的timer遇到這種情況,如果延遲超過了一個(gè)周期翩概,則會(huì)在延時(shí)結(jié)束后立刻執(zhí)行牲距,并按照之前指定的周期繼續(xù)執(zhí)行返咱。

    必須加入Runloop:使用上面的創(chuàng)建方式,會(huì)自動(dòng)把timer加入MainRunloop的NSDefaultRunLoopMode中牍鞠。如果使用以下方式創(chuàng)建定時(shí)器咖摹,就必須手動(dò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];
  1. 停止方法
    [displayLink invalidate];

    displayLink = nil;
當(dāng)把CADisplayLink對(duì)象add到runloop中后难述,selector就能被周期性調(diào)用萤晴,類似于重復(fù)的NSTimer被啟動(dòng)了;執(zhí)行invalidate操作時(shí)胁后,CADisplayLink對(duì)象就會(huì)從runloop中移除店读,selector調(diào)用也隨即停止,類似于NSTimer的invalidate方法攀芯。**
  1. 特點(diǎn):

    屏幕刷新時(shí)調(diào)用:CADisplayLink是一個(gè)能讓我們以和屏幕刷新率同步的頻率將特定的內(nèi)容畫到屏幕上的定時(shí)器類屯断。CADisplayLink以特定模式注冊(cè)到runloop后,每當(dāng)屏幕顯示內(nèi)容刷新結(jié)束的時(shí)候侣诺,runloop就會(huì)向CADisplayLink指定的target發(fā)送一次指定的selector消息殖演, CADisplayLink類對(duì)應(yīng)的selector就會(huì)被調(diào)用一次。所以通常情況下年鸳,按照iOS設(shè)備屏幕的刷新率60次/秒

    延遲:iOS設(shè)備的屏幕刷新頻率是固定的趴久,CADisplayLink在正常情況下會(huì)在每次刷新結(jié)束都被調(diào)用,精確度相當(dāng)高阻星。但如果調(diào)用的方法比較耗時(shí)朋鞍,超過了屏幕刷新周期,就會(huì)導(dǎo)致跳過若干次回調(diào)調(diào)用機(jī)會(huì)妥箕。
    如果CPU過于繁忙滥酥,無法保證屏幕60次/秒的刷新率,就會(huì)導(dǎo)致跳過若干次調(diào)用回調(diào)方法的機(jī)會(huì)畦幢,跳過次數(shù)取決CPU的忙碌程度坎吻。

    使用場(chǎng)景:從原理上可以看出,CADisplayLink適合做界面的不停重繪宇葱,比如視頻播放的時(shí)候需要不停地獲取下一幀用于界面渲染瘦真。

  1. 重要屬性

    frameInterval
    NSInteger類型的值,用來設(shè)置間隔多少幀調(diào)用一次selector方法黍瞧,默認(rèn)值是1诸尽,即每幀都調(diào)用一次。

    duration
    readOnly的CFTimeInterval值印颤,表示兩次屏幕刷新之間的時(shí)間間隔您机。需要注意的是,該屬性在target的selector被首次調(diào)用以后才會(huì)被賦值。selector的調(diào)用間隔時(shí)間計(jì)算方式是:調(diào)用間隔時(shí)間 = 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. 重復(fù)執(zhí)行
```
NSTimeInterval period = 1.0; //設(shè)置時(shí)間間隔

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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仲闽,隨后出現(xiàn)的幾起案子脑溢,更是在濱河造成了極大的恐慌,老刑警劉巖赖欣,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屑彻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡畏鼓,警方通過查閱死者的電腦和手機(jī)酱酬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來云矫,“玉大人,你說我怎么就攤上這事汗菜∪觅鳎” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵陨界,是天一觀的道長(zhǎng)巡揍。 經(jīng)常有香客問我,道長(zhǎng)菌瘪,這世上最難降的妖魔是什么腮敌? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮俏扩,結(jié)果婚禮上糜工,老公的妹妹穿的比我還像新娘。我一直安慰自己录淡,他們只是感情好捌木,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫉戚,像睡著了一般刨裆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上彬檀,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天帆啃,我揣著相機(jī)與錄音,去河邊找鬼窍帝。 笑死努潘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慈俯,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渤刃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了贴膘?” 一聲冷哼從身側(cè)響起卖子,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刑峡,沒想到半個(gè)月后洋闽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡突梦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年诫舅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宫患。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刊懈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娃闲,到底是詐尸還是另有隱情虚汛,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布皇帮,位于F島的核電站卷哩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏属拾。R本人自食惡果不足惜将谊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渐白。 院中可真熱鬧尊浓,春花似錦、人聲如沸礼预。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽托酸。三九已至褒颈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間励堡,已是汗流浹背谷丸。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留应结,地道東北人刨疼。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓泉唁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親揩慕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亭畜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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