2018-02-01

iOS【NSTimer到底準(zhǔn)不準(zhǔn)拌禾?】

2018.2.1 ?最近面試 被 問道 NSTimer 到底準(zhǔn)不準(zhǔn)的問題 當(dāng)時(shí)有點(diǎn)蒙 因?yàn)闆]爬過這個(gè)坑 所以沒法打出來 特此記錄一下

當(dāng)時(shí) 就知道 人家 問了 ?那么就說明 NSTimer 一定是不準(zhǔn)的 但是 ?問題點(diǎn)就是 在這個(gè) 準(zhǔn)不準(zhǔn)的標(biāo)準(zhǔn)是什么呢 ? ?

定時(shí)器 很簡單 ?回來后做了個(gè)測試 ?自己寫了個(gè) 定時(shí)器?

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

? ? if (!_timer) {

? ? ? ? _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(logInfo) userInfo:nil repeats:YES];

? ? }

}

- (void)logInfo {

? ? NSLog(@"timer test");

}

?結(jié)果是?

2018-02-01 09:12:32.566622+0800 QTimer[20276:7878806] timer test

2018-02-01 09:12:33.566811+0800 QTimer[20276:7878806] timer test

2018-02-01 09:12:34.566510+0800 QTimer[20276:7878806] timer test

2018-02-01 09:12:35.567532+0800 QTimer[20276:7878806] timer test

2018-02-01 09:12:36.567613+0800 QTimer[20276:7878806] timer test

2018-02-01 09:12:37.566615+0800 QTimer[20276:7878806] timer test

2018-02-01 09:12:38.567415+0800 QTimer[20276:7878806] timer test

2018-02-01 09:12:39.567650+0800 QTimer[20276:7878806] timer test

2018-02-01 09:12:40.566592+0800 QTimer[20276:7878806] timer test

可以看出來 ?定時(shí)器 并不是準(zhǔn)確的 ?1S的 ?誤差 在 1毫秒以內(nèi) ?應(yīng)該是很準(zhǔn)的了

但是 確實(shí) 是不準(zhǔn)的 ? ?我們繼續(xù) 給 定時(shí)器 的方法里面 繼續(xù) 添加更多的耗時(shí)代碼;

- (void)logInfo {

? ? int count = 0;

? ? for (int i = 0; i < 1000000000; i++) {

? ? ? ? count += i;

? ? }

? ? NSLog(@"timer test");

}

結(jié)果

2018-02-01 09:40:38.194879+0800 QTimer[9749:3330951] timer test

2018-02-01 09:40:44.188463+0800 QTimer[9749:3330951] timer test

2018-02-01 09:40:50.172012+0800 QTimer[9749:3330951] timer test

2018-02-01 09:40:56.172139+0800 QTimer[9749:3330951] timer test

2018-02-01 09:41:02.179022+0800 QTimer[9749:3330951] timer test

2018-02-01 09:41:08.170254+0800 QTimer[9749:3330951] timer test

2018-02-01 09:41:14.169011+0800 QTimer[9749:3330951] timer test


可以清晰的看出來 時(shí)間已經(jīng)不準(zhǔn)的 準(zhǔn)確的來說 ?那么原因是什么呢 經(jīng)過 查找資料得知

定時(shí)器被添加在主線程中,由于定時(shí)器在一個(gè)RunLoop中被檢測一次匪傍,所以如果在這一次的RunLoop中做了耗時(shí)的操作,當(dāng)前RunLoop持續(xù)的時(shí)間超過了定時(shí)器的間隔時(shí)間茵休,那么下一次定時(shí)就被延后了手蝎。

意思就是說 ?你這個(gè) 定時(shí)器的方法里面 相當(dāng)于 一個(gè)runloop ?只有當(dāng) 方法 里面代碼 走完了 定時(shí)器 才會 繼續(xù) 起作用 就是說 ?當(dāng) ?定時(shí)器 方法 里面 的耗時(shí)操作 超過了 定時(shí)器的時(shí)間間隔 ?那么 就會 導(dǎo)致 定時(shí)方法里面的代碼 執(zhí)行之后 ?才會繼續(xù)定時(shí)器 再間隔一s 之后執(zhí)行這個(gè)方法 (這個(gè)情況 會出現(xiàn)的 前提是 定時(shí)器里面的方法 的耗時(shí)操作 超過了 定時(shí)的 時(shí)間間隔);

接下來就是 解決方法了 ?既然 執(zhí)行方法 會 阻礙NSTtimer ?那么我們就把他們分開 ?

解決方法:

1棵介、在子線程中創(chuàng)建timer,在主線程進(jìn)行定時(shí)任務(wù)的操作

2唠雕、在子線程中創(chuàng)建timer岩睁,在子線程中進(jìn)行定時(shí)任務(wù)的操作锐极,需要UI操作時(shí)切換回主線程進(jìn)行操作

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(newThread)object:nil];2[thread start];

- (void)newThread2{

?@autoreleasepool

?{

[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(addTime) userInfo:nil repeats:YES];

?[[NSRunLoop currentRunLoop] run];

?}

}

在子線程中將NSTimer以默認(rèn)方式加到該線程的runloop中,啟動(dòng)子線程肋层。(注意 timer 的runloop 模式的形象 因?yàn)槭窃谧泳€程里面 所以 runloop的model 沒考慮 如果特殊情況 考慮runloop的model ?就不采用 默認(rèn)的方式創(chuàng)建timer 手動(dòng)添加 到runloop 里面 去 采用commodmodel )


或者干脆 直接用多線程GCD 定時(shí)器 ?也是 多線程方式 ?回歸主線程 刷新UI?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栋猖,一起剝皮案震驚了整個(gè)濱河市蒲拉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燃领,老刑警劉巖锦援,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異曼库,居然都是意外死亡毁枯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門种玛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒂誉,“玉大人距帅,你說我怎么就攤上這事∩芤疲” “怎么了讥电?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞬测。 經(jīng)常有香客問我纠炮,道長,這世上最難降的妖魔是什么孝宗? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任耕肩,我火速辦了婚禮问潭,結(jié)果婚禮上婚被,老公的妹妹穿的比我還像新娘。我一直安慰自己去枷,他們只是感情好是复,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布淑廊。 她就那樣靜靜地躺著特咆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪画拾。 梳的紋絲不亂的頭發(fā)上菜职,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機(jī)與錄音蜜另,去河邊找鬼举瑰。 笑死蔬螟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旧巾。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼佑吝,長吁一口氣:“原來是場噩夢啊……” “哼芋忿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戈钢,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎开仰,沒想到半個(gè)月后薪铜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谓娃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年滨达,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俯艰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡画株,死狀恐怖涩搓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情良拼,我是刑警寧澤充边,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站贬媒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏际乘。R本人自食惡果不足惜漂佩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一罪塔、第九天 我趴在偏房一處隱蔽的房頂上張望征堪。 院中可真熱鬧关拒,春花似錦、人聲如沸谐算。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雇毫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枚粘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工馍迄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留攀圈,地道東北人峦甩。 一個(gè)月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像犬辰,于是被迫代替她去往敵國和親冰单。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

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

  • 這個(gè)冬天雪下得很大 蒼天把掏心窩的白浴栽,給了大地 / 那條通往金色河流的足跡 它走得太急吃度,又戛然而止 《2018年元...
    薊門閑客閱讀 213評論 0 0
  • [flag]1[flag] 【上海展會年】2018【上海展會年】 【2018總數(shù)】9【2018總數(shù)】 【上海展會1...
    JSuser888閱讀 434評論 0 1
  • 【2018年·隨心記】 2 @2018.02.01~02.28 2018年2月湛江也迎來了新一輪...
    Shaoerting閱讀 242評論 0 1
  • 民以食為天椿每,由于小時(shí)候發(fā)育時(shí)趕上住宿吃食堂食物饋乏的年代英遭,長大后補(bǔ)償?shù)男睦碜魉睿屛也恢挥X走上吃貨的道路汁尺,人家是...
    77824劉閱讀 233評論 0 1
  • 這學(xué)期以來痴突,其實(shí)很久沒熬過夜了。扎扎實(shí)實(shí)的熄燈睡都已經(jīng)成了每天的習(xí)慣狼荞,一個(gè)人靜悄悄寫字的晚上好像已經(jīng)成了高三那年獨(dú)...
    張枯茗閱讀 356評論 0 1