IOS 定時(shí)器創(chuàng)建的三種方式

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

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í)行方法的對象。

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

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

2. 釋放方法

[timer invalidate];

注意 :

調(diào)用創(chuàng)建方法后篓像,target對象的計(jì)數(shù)器會加1,直到執(zhí)行完畢,自動(dòng)減1。如果是循環(huán)執(zhí)行的話急鳄,就必須手動(dòng)關(guān)閉,否則可以不執(zhí)行釋放方法嚷闭。

3. 特性

存在延遲

不管是一次性的還是周期性的timer的實(shí)際觸發(fā)事件的時(shí)間攒岛,都會與所加入的RunLoop和RunLoop Mode有關(guān)赖临,如果此RunLoop正在執(zhí)行一個(gè)連續(xù)性的運(yùn)算胞锰,timer就會被延時(shí)出發(fā)。重復(fù)性的timer遇到這種情況兢榨,如果延遲超過了一個(gè)周期嗅榕,則會在延時(shí)結(jié)束后立刻執(zhí)行,并按照之前指定的周期繼續(xù)執(zhí)行吵聪。

必須加入Runloop

使用上面的創(chuàng)建方式凌那,會自動(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)建方法

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

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

2. 停止方法

self.displayLink invalidate];

self.displayLink = nil;

當(dāng)把CADisplayLink對象add到runloop中后,selector就能被周期性調(diào)用块攒,類似于重復(fù)的NSTimer被啟動(dòng)了励稳;執(zhí)行invalidate操作時(shí),CADisplayLink對象就會從runloop中移除囱井,selector調(diào)用也隨即停止驹尼,類似于NSTimer的invalidate方法。

3. 特性

屏幕刷新時(shí)調(diào)用

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

延遲

iOS設(shè)備的屏幕刷新頻率是固定的讲逛,CADisplayLink在正常情況下會在每次刷新結(jié)束都被調(diào)用亏吝,精確度相當(dāng)高。但如果調(diào)用的方法比較耗時(shí)妆绞,超過了屏幕刷新周期顺呕,就會導(dǎo)致跳過若干次回調(diào)調(diào)用機(jī)會枫攀。

如果CPU過于繁忙,無法保證屏幕60次/秒的刷新率株茶,就會導(dǎo)致跳過若干次調(diào)用回調(diào)方法的機(jī)會来涨,跳過次數(shù)取決CPU的忙碌程度。

使用場景

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

4. 重要屬性

frameInterval

NSInteger類型的值僵闯,用來設(shè)置間隔多少幀調(diào)用一次selector方法卧抗,默認(rèn)值是1,即每幀都調(diào)用一次鳖粟。

duration

readOnly的CFTimeInterval值社裆,表示兩次屏幕刷新之間的時(shí)間間隔。需要注意的是向图,該屬性在target的selector被首次調(diào)用以后才會被賦值泳秀。selector的調(diào)用間隔時(shí)間計(jì)算方式是:調(diào)用間隔時(shí)間 = duration × frameInterval。

三榄攀、GCD方式

執(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í)行事件

});

重復(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)容合作請聯(lián)系作者
  • 序言:七十年代末嗜傅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子檩赢,更是在濱河造成了極大的恐慌吕嘀,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞瞒,死亡現(xiàn)場離奇詭異偶房,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)憔狞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門蝴悉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘾敢,你說我怎么就攤上這事拍冠。” “怎么了簇抵?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵庆杜,是天一觀的道長。 經(jīng)常有香客問我碟摆,道長晃财,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮断盛,結(jié)果婚禮上罗洗,老公的妹妹穿的比我還像新娘。我一直安慰自己钢猛,他們只是感情好伙菜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著命迈,像睡著了一般贩绕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壶愤,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天淑倾,我揣著相機(jī)與錄音,去河邊找鬼征椒。 笑死娇哆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陕靠。 我是一名探鬼主播迂尝,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剪芥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起琴许,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤税肪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后榜田,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體益兄,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年箭券,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了净捅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辩块,死狀恐怖蛔六,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情废亭,我是刑警寧澤国章,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站豆村,受9級特大地震影響液兽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掌动,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一四啰、第九天 我趴在偏房一處隱蔽的房頂上張望宁玫。 院中可真熱鬧,春花似錦柑晒、人聲如沸撬统。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恋追。三九已至,卻和暖如春罚屋,著一層夾襖步出監(jiān)牢的瞬間苦囱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工脾猛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撕彤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓猛拴,卻偏偏與公主長得像羹铅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子愉昆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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