iOS開發(fā)-從定時(shí)器失效來了解RunLoop

定時(shí)器,相信大家都不會(huì)陌生瓢剿,開發(fā)中經(jīng)常會(huì)遇到逢慌,最常見的廣告頁、計(jì)時(shí)等跋选。當(dāng)然了這些都不是大問題涕癣,但是有時(shí)候如果注意的話,相信大家都會(huì)遇到一個(gè)問題前标,定時(shí)器好好的執(zhí)行著我們的一些操作的時(shí)候坠韩,如果我們這時(shí)候有UI操作(比如滾動(dòng)界面),我們會(huì)發(fā)現(xiàn)好像沒定時(shí)器一樣炼列,但是UI操作結(jié)束時(shí)只搁,定時(shí)器又會(huì)重新工作。相信大家第一時(shí)間都會(huì)想到RunLoop俭尖。

定時(shí)器失效演示

說到定時(shí)器失效談到了RunLoop氢惋,那我們先來創(chuàng)建定時(shí)器。其實(shí)創(chuàng)建定時(shí)器的方法有好幾種稽犁,這里我們所以下做常用到的三種方法焰望。其實(shí)也可以說成是兩種,NSTimer分成了類方法創(chuàng)建和對(duì)象方法創(chuàng)建已亥。

1熊赖、

[NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {

NSLog(@"%ld",++self.page);

}];

這種類方法創(chuàng)建定時(shí)的一點(diǎn)好處就是不用我們把定時(shí)器添加到RunLoop上,但是好像跟今天的這個(gè)問題就解決不了了虑椎。(好像是的可能這點(diǎn)我也理解的不太清楚震鹉,因?yàn)槭穷悾翘砑覴unLoop上的是NSTimer的對(duì)象)捆姜。

2传趾、用NSTimer的對(duì)象方法創(chuàng)建

NSTimer *timer = [[NSTimer alloc]initWithFireDate:[NSDate distantPast] interval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];

[[NSRunLoop currentRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];

這種方式要想定時(shí)器工作,必須要把定時(shí)器添加到RunLoop的上泥技,而我們一般做的就是講定時(shí)器添加到默認(rèn)模式上的浆兰。

3、相信大家試過的都知道用上面兩種方法創(chuàng)建就會(huì)出現(xiàn)上圖所示的問題零抬。但是用下面的方法創(chuàng)建的話就不會(huì)出現(xiàn)镊讼。GCD創(chuàng)建定時(shí)器:

dispatch_queue_t myQuest = dispatch_get_main_queue();

self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, myQuest);//這里要將定時(shí)器設(shè)為全局,否則定時(shí)器將不會(huì)啟動(dòng)平夜。

dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 1.0 * NSEC_PER_SEC);

dispatch_source_set_event_handler(self.timer, ^{

NSLog(@"%ld,--%@--",++self.page,[NSRunLoop currentRunLoop]);

});

dispatch_resume(self.timer);

GCD中的單位是納秒NSEC_PER_SEC這個(gè)宏可以點(diǎn)進(jìn)去看一下是1000000000蝶棋,這個(gè)蘋果已經(jīng)為我們做好了不用管,就按照我們平時(shí)的那種做法多少秒就寫幾就好了忽妒。

實(shí)驗(yàn)發(fā)現(xiàn)玩裙,用NSTimer創(chuàng)建兼贸,要解決定時(shí)器失效的問題,要將定時(shí)器添加到UI模式下:UITrackingRunLoopMode和NSDefaultRunLoopMode下才可以吃溅,通常直接寫NSRunLoopCommonModes(包含了UI和默認(rèn)模式)才可以解決定時(shí)器失效的問題溶诞,而用GCD寫的話就不用了,其實(shí)GCD也用只不過蘋果幫我們封裝好了决侈,不用我們自己寫了螺垢。

相信好多人不知道為什么回事這樣的效果,原因是什么赖歌。

RunLoop運(yùn)行循環(huán)枉圃,我們也可以叫做死循環(huán),其實(shí)我們就可以把他當(dāng)做是一個(gè)傭人(程序的傭人)庐冯;

每一個(gè)程勛都有一個(gè)RunLoop孽亲,我們的操作都是由他來幫我們實(shí)現(xiàn)的RunLoop總共有五種模式,只不過我們用到的只有上面三種展父。

每一個(gè)模式下有souce,obsever,Timer三個(gè)服務(wù)(優(yōu)先級(jí)從高到低)返劲;而我們的Timer就是在這里被執(zhí)行的,平常的時(shí)候我們?cè)谀J(rèn)模式下栖茉,RunLoop就會(huì)幫我們執(zhí)行篮绿,但是有一些UI操作時(shí),這時(shí)候RunLoop已經(jīng)切換到UI模式了吕漂,因?yàn)閁I模式的優(yōu)先級(jí)比默認(rèn)模式的優(yōu)先級(jí)高搔耕,所以有一些滑動(dòng)操作時(shí),RunLoop就會(huì)去執(zhí)行痰娱,因?yàn)槊總€(gè)應(yīng)用程序只有一個(gè)RunLoop所以我們默認(rèn)模式下的timer就不會(huì)工作了,所以我們想菩收,RunLoop既然去為為UI模式工作了梨睁,那我們就把定時(shí)器放到UI模式下就可以了,事實(shí)證明真的如此娜饵。

有的人在想坡贺,那我們剛一開始就把timer直接放在UI模式下,這樣做的話你會(huì)發(fā)現(xiàn)箱舞,跑起來的時(shí)候定時(shí)器也沒起作用遍坟,只有在滑動(dòng)界面的時(shí)候才會(huì)起作用。因?yàn)橹挥性谧鲆恍︰I操作時(shí)才會(huì)觸發(fā)RunLoop的UI模式晴股,平常的時(shí)候是沒有用的愿伴。所以我們一般就會(huì)把timer放在默認(rèn)和UI模式下,這樣不管正常還是UI滑動(dòng)界面時(shí)都不會(huì)使定時(shí)器失效电湘「艚冢可以看一下圖更清晰:

RunLoop圖示

有什么不對(duì)的地方請(qǐng)大家指正鹅经。或者誰有更好的理解怎诫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘾晃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幻妓,更是在濱河造成了極大的恐慌蹦误,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肉津,死亡現(xiàn)場離奇詭異强胰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阀圾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門哪廓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人初烘,你說我怎么就攤上這事涡真。” “怎么了肾筐?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵哆料,是天一觀的道長。 經(jīng)常有香客問我吗铐,道長东亦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任唬渗,我火速辦了婚禮典阵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镊逝。我一直安慰自己壮啊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布撑蒜。 她就那樣靜靜地躺著歹啼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪座菠。 梳的紋絲不亂的頭發(fā)上狸眼,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音浴滴,去河邊找鬼拓萌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛升略,可吹牛的內(nèi)容都是我干的司志。 我是一名探鬼主播甜紫,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼骂远!你這毒婦竟也來了囚霸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤激才,失蹤者是張志新(化名)和其女友劉穎拓型,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘸恼,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劣挫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了东帅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片压固。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡县恕,死狀恐怖稚叹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菠净,我是刑警寧澤愧膀,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布拦键,位于F島的核電站,受9級(jí)特大地震影響檩淋,放射性物質(zhì)發(fā)生泄漏芬为。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一蟀悦、第九天 我趴在偏房一處隱蔽的房頂上張望媚朦。 院中可真熱鬧,春花似錦日戈、人聲如沸莲镣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至的圆,卻和暖如春鼓拧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背越妈。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工季俩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梅掠。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓酌住,卻偏偏與公主長得像店归,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酪我,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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

  • 在現(xiàn)在很多app中消痛,我們經(jīng)常會(huì)看到輪播圖,輪播廣告等等都哭,比如淘寶秩伞、京東商城app,他們都可以定時(shí)循環(huán)地播放廣告欺矫、圖...
    皮皮瑞閱讀 1,675評(píng)論 0 4
  • ios 常用的定時(shí)器有三種:NSTime纱新,CADisplayLink和GCD。 NsTimer // 參數(shù):Int...
    殿小七閱讀 832評(píng)論 0 2
  • runtime 和 runloop 作為一個(gè)程序員進(jìn)階是必須的穆趴,也是非常重要的脸爱, 在面試過程中是經(jīng)常會(huì)被問到的, ...
    SOI閱讀 21,791評(píng)論 3 63
  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling閱讀 1,436評(píng)論 0 13
  • 找資料時(shí)未妹,突然看到了這張照片簿废,時(shí)光一下子倒回了幾年前。 那時(shí)候教寂,無憂無慮捏鱼,沒事就背個(gè)畫架去寫生。 溫暖的清晨酪耕,或者...
    高盼畫畫閱讀 399評(píng)論 0 8