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í)器 才會(huì) 繼續(xù) 起作用 就是說 ?當(dāng) ?定時(shí)器 方法 里面 的耗時(shí)操作 超過了 定時(shí)器的時(shí)間間隔 ?那么 就會(huì) 導(dǎo)致 定時(shí)方法里面的代碼 執(zhí)行之后 ?才會(huì)繼續(xù)定時(shí)器 再間隔一s 之后執(zhí)行這個(gè)方法 (這個(gè)情況 會(huì)出現(xiàn)的 前提是 定時(shí)器里面的方法 的耗時(shí)操作 超過了 定時(shí)的 時(shí)間間隔);

接下來就是 解決方法了 ?既然 執(zhí)行方法 會(huì) 阻礙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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評論 2 373

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

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