iOS中的幾種timer比較

工作需要轩褐,粗略了解了ios上的幾種定時(shí)器椎咧。

NSTimer:

? ? ? ? ? ?這個(gè)底層怎么定時(shí)我不清楚,應(yīng)該是到了一定時(shí)間之后把介,向runLoop添加一個(gè)事件勤讽,這也就意味著蟋座,如果想在異步線程開(kāi)啟timer ,就需要手動(dòng)的將timer 添加到runLoop中脚牍,并且run起來(lái)向臀。

? ? ? ? ? ?網(wǎng)上看了一些說(shuō)的精確度,不是明白莫矗,親測(cè)過(guò),子線程創(chuàng)建一個(gè)timer砂缩,runLoop run起來(lái)作谚,只要timer里面的事件,不超過(guò)timer定時(shí)的時(shí)間庵芭,timer定時(shí)還是很準(zhǔn)確的妹懒,所以如果項(xiàng)目需要,timer里面的執(zhí)行事件的時(shí)間超過(guò)了定時(shí)器的時(shí)間双吆,就會(huì)出問(wèn)題了(試想一下眨唬,即使把事件再拿到另外一個(gè)線程去執(zhí)行,執(zhí)行時(shí)間永遠(yuǎn)都是大于定時(shí)時(shí)間的好乐,即使不影響定時(shí)時(shí)間匾竿,那么事件處理的堆積事件就會(huì)越來(lái)越多,肯定無(wú)法滿(mǎn)足需求蔚万,所以最好的是岭妖,將事件拆分,做成多個(gè)管道反璃,多個(gè)定時(shí)器昵慌,定時(shí)器時(shí)間大于處理定時(shí)器事件的時(shí)間)。我們通常說(shuō)的timer會(huì)出問(wèn)題淮蜈,我猜想可能是在主線程定義了一個(gè)timer斋攀,runloop執(zhí)行一個(gè)耗時(shí)很長(zhǎng)的循環(huán),錯(cuò)過(guò)了timer的周期梧田,這肯定會(huì)出問(wèn)題淳蔼,還有就是timer里面的事件處理時(shí)間不夠也會(huì)出問(wèn)題。所以我的解決辦法是裁眯,子線程runLoop run起來(lái)肖方,保持線程,同時(shí)保證timer里面的事件處理時(shí)間不超過(guò)timer時(shí)間未状,這樣就ok了俯画。

? ? ? ? ? 綜上所訴,用處理一般的事件完全足夠司草,只是使用中需要注意艰垂。


CADisplayLink:

? ? ? ? ? 這個(gè)是根據(jù)屏幕的幀率來(lái)發(fā)送事件泡仗,也依賴(lài)于runLoop,也就是說(shuō)猜憎,我們只能控制多少幀娩怎,觸發(fā)我們定義的事件,可用于界面的刷新胰柑,不能隨心所欲的控制時(shí)間截亦,不滿(mǎn)足我們一般的需求。使用也很簡(jiǎn)單柬讨,自行看API


GCD的source timer:

? ? ? 個(gè)人覺(jué)得這是比較給力(原諒我詞匯的匱乏)的一個(gè)定時(shí)器了崩瓤。原因如下,它不依賴(lài)于runLoop踩官,底層兩個(gè)隊(duì)列却桶,一個(gè)事件隊(duì)列,一個(gè)任務(wù)隊(duì)列蔗牡,定時(shí)到了之后颖系,從任務(wù)隊(duì)列里取出事件,加入到事件隊(duì)列(之前還有一步辩越,向任務(wù)隊(duì)列push任務(wù))嘁扼,執(zhí)行事件,至于他的一直執(zhí)行(為什么不依賴(lài)于runLoop黔攒,這于GCD的底層實(shí)現(xiàn)有關(guān)偷拔,有興趣可以自行了解),放到一個(gè)子線程執(zhí)行(想在主線程執(zhí)行的亏钩,可以用mainQUeue包一層)莲绰,在子線程的執(zhí)行順序也是串行的,所以如果block的執(zhí)行事件時(shí)間大于定時(shí)時(shí)間姑丑,還是會(huì)阻塞昵骤,可以一定層度上解決对碌,請(qǐng)看下面代

可以在block塊里再用一個(gè)隊(duì)列躲舌,異步執(zhí)行而账,包起來(lái),但是我們看一下執(zhí)行結(jié)果


確實(shí)留拾,執(zhí)行事件表面看并沒(méi)有影響定時(shí)器的定時(shí)戳晌,但是注意看始終都是系統(tǒng)分配的幾個(gè)線程去執(zhí)行事件,也就是說(shuō)這幾個(gè)線程是重復(fù)利用的痴柔,當(dāng)?shù)谝淮问褂猛曷儋耍诙问褂玫臅r(shí)候,定時(shí)并不準(zhǔn)確(可能是線程清理需要事件,具體不清楚)豪嚎,還有定時(shí)器的定時(shí)還是不準(zhǔn)確搔驼,這可能就跟GCDSource內(nèi)部實(shí)現(xiàn)有關(guān)系了,所以不推薦這樣使用侈询,目前我個(gè)人的想法就是舌涨,如果事件處理時(shí)間過(guò)長(zhǎng),要嗎想辦法拆分事件扔字,加管道囊嘉,加定時(shí)器,要嗎延長(zhǎng)定時(shí)時(shí)間革为。

與timer相比扭粱,的優(yōu)勢(shì)就是,不需要維持runLoop篷角,(性能消耗上或許有區(qū)別焊刹,沒(méi)有實(shí)際看過(guò))系任,還有本身就是子線程去執(zhí)行的恳蹲,不會(huì)阻塞主線程。


以上只是我個(gè)人的想法和總結(jié)俩滥,肯定有說(shuō)得不對(duì)的地方嘉蕾,希望多討論,多批評(píng)指正霜旧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末错忱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挂据,更是在濱河造成了極大的恐慌以清,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崎逃,死亡現(xiàn)場(chǎng)離奇詭異掷倔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)个绍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)勒葱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巴柿,你說(shuō)我怎么就攤上這事凛虽。” “怎么了广恢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵凯旋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瓦阐,這世上最難降的妖魔是什么蜗侈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮睡蟋,結(jié)果婚禮上踏幻,老公的妹妹穿的比我還像新娘。我一直安慰自己戳杀,他們只是感情好该面,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著信卡,像睡著了一般隔缀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上傍菇,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天猾瘸,我揣著相機(jī)與錄音,去河邊找鬼丢习。 笑死牵触,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咐低。 我是一名探鬼主播揽思,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼见擦!你這毒婦竟也來(lái)了钉汗?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鲤屡,失蹤者是張志新(化名)和其女友劉穎损痰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體酒来,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卢未,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了役首。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尝丐。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衡奥,靈堂內(nèi)的尸體忽然破棺而出爹袁,到底是詐尸還是另有隱情,我是刑警寧澤矮固,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布失息,位于F島的核電站譬淳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盹兢。R本人自食惡果不足惜邻梆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绎秒。 院中可真熱鬧浦妄,春花似錦、人聲如沸见芹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玄呛。三九已至阅懦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徘铝,已是汗流浹背耳胎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惕它,地道東北人怕午。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像怠缸,于是被迫代替她去往敵國(guó)和親诗轻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钳宪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 先貼下 apple doc, 本文基本是對(duì)照 doc 的翻譯:https://developer.apple.co...
    brownfeng閱讀 6,849評(píng)論 8 111
  • 什么是Run Loops RunLoops是與線程相關(guān)聯(lián)的基礎(chǔ)部分揭北,一個(gè)Run Loop就是事件處理循環(huán),他是用來(lái)...
    傻傻小蘿卜閱讀 957評(píng)論 0 5
  • 從哪說(shuō)起呢吏颖? 單純講多線程編程真的不知道從哪下嘴搔体。。 不如我直接引用一個(gè)最簡(jiǎn)單的問(wèn)題半醉,以這個(gè)作為切入點(diǎn)好了 在ma...
    Mr_Baymax閱讀 2,734評(píng)論 1 17
  • 本文將從以下幾個(gè)部分來(lái)介紹多線程疚俱。 第一部分介紹多線程的基本原理。 第二部分介紹Run loop缩多。 第三部分介紹多...
    曲年閱讀 1,255評(píng)論 2 14
  • 這是一篇對(duì)Run Loop開(kāi)發(fā)文檔《Threading Program Guide:Run Loops》的翻譯呆奕,來(lái)...
    鴻雁長(zhǎng)飛光不度閱讀 3,622評(píng)論 3 29