深入理解 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]

最近在看線程泵暗眨活,發(fā)現(xiàn)了這個(gè)函數(shù)無(wú)法理解四苇,根本原因還是這個(gè)函數(shù)的蘋(píng)果文檔沒(méi)有深入理解孝凌,然后沒(méi)有多做嘗試。

先說(shuō)結(jié)論月腋,再說(shuō)過(guò)程蟀架。
結(jié)論:1)runMode:beforeDate只是執(zhí)行一次runloop循環(huán)瓣赂,處理完第一次input source內(nèi)容,就會(huì)結(jié)束該runloop片拍。注:第一次的input source內(nèi)容要有活干煌集,才算第一次。2)timer不能算input source捌省,比較特殊苫纤,文檔里有說(shuō)明,你會(huì)發(fā)現(xiàn)timer能正常運(yùn)作纲缓。直到第一次input source出現(xiàn)才會(huì)停止runloop


該函數(shù)對(duì)應(yīng)的蘋(píng)果文檔:

Demo1:為了驗(yàn)證run是啟動(dòng)一直跑卷拘,常駐。

thread中開(kāi)啟監(jiān)聽(tīng)祝高,加入port栗弟,執(zhí)行run


用戶點(diǎn)擊屏幕操作,會(huì)怎么執(zhí)行


啟動(dòng)后工闺,為了啟動(dòng)runloop而加入的port沒(méi)活干乍赫,直接發(fā)出32休眠通知。
用戶點(diǎn)擊屏幕陆蟆,runloop開(kāi)始處理source0

每次用戶點(diǎn)擊耿焊,都會(huì)進(jìn)入一次runloop循環(huán),但是直接是到達(dá)退出runloop狀態(tài)遍搞,然后緊接著再進(jìn)入罗侯。run的本質(zhì)是不斷執(zhí)行runMode:。

Demo2:為了驗(yàn)證runMode只運(yùn)行一次
其余不變溪猿,將[[NSRunLoop currentRunLoop] run];
改為[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

啟動(dòng)和run效果一樣钩杰,但是runMode的文檔是?“it returns after either the first input source is processed or?limitDate?is reached“。處理第一次的input source后就會(huì)返回诊县,那么port也算第一次讲弄,但是是個(gè)沒(méi)有任務(wù)的第一次(后面會(huì)做個(gè)實(shí)驗(yàn),加入的是有任務(wù)的第一次依痊,在看點(diǎn)擊屏幕是否還會(huì)觸發(fā))避除,提前結(jié)論:根據(jù)實(shí)驗(yàn),應(yīng)該是需要“有活干的第一次”才會(huì)停下來(lái)runloop胸嘁。
緊接著點(diǎn)擊屏幕:

執(zhí)行完一次source0點(diǎn)擊屏幕瓶摆,runloop就結(jié)束了。
再次點(diǎn)擊性宏,會(huì)出現(xiàn)崩潰群井。該線程已經(jīng)結(jié)束,不再執(zhí)行任務(wù)毫胜。報(bào)錯(cuò)是EXC_BAD_ACCESS书斜。本質(zhì)就是該塊內(nèi)存已經(jīng)不能再執(zhí)行所發(fā)出的指令了诬辈。

延伸:如果把?[self performSelector:@selector(tttt) onThread:self.testThread withObject:nil waitUntilDone:YES];換成
?[self performSelector:@selector(tttt) onThread:self.testThread withObject:nil waitUntilDone:NO];就不會(huì)崩潰。
YES的含義是一直等到執(zhí)行完畢再往下執(zhí)行荐吉;NO的含義是不用等執(zhí)行完畢繼續(xù)往下執(zhí)行焙糟。

Demo3:也是為了驗(yàn)證runloop只跑一次循環(huán)

兩個(gè)performSelector...waitUntilDone:NO都執(zhí)行了。

一個(gè)performSelector...waitUntilDone:YES样屠;一個(gè)performSelector...waitUntilDone:NO酬荞,只執(zhí)行第一句,因?yàn)橐鹊谝粋€(gè)執(zhí)行完瞧哟,執(zhí)行完runloop一次循環(huán)就結(jié)束了混巧。不再執(zhí)行第二個(gè)input source了。當(dāng)然勤揩,此處再點(diǎn)擊一次就是崩潰咧党。因?yàn)閜erform到一個(gè)已經(jīng)結(jié)束的線程上了。

Demo4:runMode只執(zhí)行一次陨亡,第一次加入的任務(wù)有活干傍衡,再點(diǎn)擊就無(wú)反應(yīng)了。

如果在runMode前加入performSelector...waitUntilDone:NO,則是在runloop中執(zhí)行

如果在runMode前加入performSelector...waitUntilDone:YES,則執(zhí)行完再往下走负蠕,相當(dāng)于runloop中是空內(nèi)容蛙埂,無(wú)法啟動(dòng)runloop。perform的任務(wù)是沒(méi)有在runloop中執(zhí)行的遮糖。

Demo5:在runloop中加入timer绣的,timer比較特殊

關(guān)于timer的小知識(shí)點(diǎn):
scheduledTimerWithTimeInterval生成的timer =?timerWithTimeInterval+[NSRunLoop currentRunLoop] addTimer...]生成的timer。

runMode方法根據(jù)文檔:

timer會(huì)在等待這個(gè)方法返回時(shí)欲账,觸發(fā)很多次屡江。不被認(rèn)為是一種input source。
最后赛不,簡(jiǎn)單提一嘴通過(guò)runloop檢測(cè)卡頓原理:2和64是檢測(cè)卡頓狀態(tài)惩嘉,根據(jù)狀態(tài)的變化間隔。后面再細(xì)聊~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踢故,一起剝皮案震驚了整個(gè)濱河市文黎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殿较,老刑警劉巖耸峭,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異斜脂,居然都是意外死亡抓艳,警方通過(guò)查閱死者的電腦和手機(jī)触机,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)帚戳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玷或,“玉大人,你說(shuō)我怎么就攤上這事片任∑眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵对供,是天一觀的道長(zhǎng)位他。 經(jīng)常有香客問(wèn)我,道長(zhǎng)产场,這世上最難降的妖魔是什么鹅髓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮京景,結(jié)果婚禮上窿冯,老公的妹妹穿的比我還像新娘。我一直安慰自己确徙,他們只是感情好醒串,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鄙皇,像睡著了一般芜赌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伴逸,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天缠沈,我揣著相機(jī)與錄音,去河邊找鬼错蝴。 笑死博烂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漱竖。 我是一名探鬼主播禽篱,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼馍惹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼躺率!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起万矾,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤悼吱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后良狈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體后添,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年薪丁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遇西。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馅精。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粱檀,靈堂內(nèi)的尸體忽然破棺而出洲敢,到底是詐尸還是另有隱情,我是刑警寧澤茄蚯,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布压彭,位于F島的核電站,受9級(jí)特大地震影響渗常,放射性物質(zhì)發(fā)生泄漏壮不。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一皱碘、第九天 我趴在偏房一處隱蔽的房頂上張望忆畅。 院中可真熱鬧,春花似錦尸执、人聲如沸家凯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绊诲。三九已至,卻和暖如春褪贵,著一層夾襖步出監(jiān)牢的瞬間掂之,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工脆丁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留世舰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓槽卫,卻偏偏與公主長(zhǎng)得像跟压,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歼培,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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