iOS中Run Loop的那些坑

回顧一下椭蹄,Run Loop就是個監(jiān)聽事件的循環(huán)庐杨,會不停的檢查它的事件源(Timer和Input Source)有沒有事件發(fā)生,如果有事件發(fā)生就處理事件或者調(diào)用事件的處理方法骤公。

坑一

在線程中添加Timer時呐粘,肯定需要先生成Timer對象啦满俗,有類方法也有實例方法,如果是使用scheduledTimerWith***接口生成的Timer對象作岖,會自動添加到當前線程的NSDefaultRunLoopMode中唆垃;如果是其他接口生成的Timer對象,則需要用-addTimer:forMode
添加Timer痘儡,這樣做的好處是可以指定添加Timer的Run Loop以及模式辕万。

坑二

如果Run Loop中添加的是Timer而沒有其他Input Source,而這個Timer只運行一次沉删,那么Timer事件觸發(fā)后Timer事件源就會從Run Loop刪除渐尿,那么再運行Run Loop就會立刻返回;同時Timer事件觸發(fā)是不會讓Run Loop返回的矾瑰,即使使用CF層的CFRunLoopRef運行接口SInt32 CFRunLoopRunInMode (mode, seconds, returnAfterSourceHandled);
運行Run Loop砖茸,其第三個參數(shù)為YES,Timer事件觸發(fā)仍然不會導(dǎo)致當前Run Loop的運行返回殴穴。

坑三

如果是使用NSRunLoop凉夯,有三個運行的接口:
//運行 NSRunLoop,運行模式為默認的NSDefaultRunLoopMode模式采幌,沒有超時限制- (void)run;//運行 NSRunLoop: 參數(shù)為運行模式劲够、時間期限,返回值為YES表示是處理事件后返回的休傍,NO表示是超時或者停止運行導(dǎo)致返回的征绎。[Update]: 感謝網(wǎng)友olo的提醒:返回值只有在RunLoop沒有運行的情況下才返回NO。比如:1)沒有添加輸入源和定時器源 2)mode為NSRunLoopCommonModes 或UITrackingRunLoopMode 等“非法”參數(shù)磨取。如果超時的話返回YES人柿,即使limitDate的初始值小于當前的Date柴墩,RunLoop也會執(zhí)行一次然后馬上返回YES。- (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate;//運行 NSRunLoop: 參數(shù)為運時間期限凫岖,運行模式為默認的NSDefaultRunLoopMode模式- (void)runUntilDate:(NSDate *)limitDate;

建議是使用第二個接口來運行拐邪,因為它能夠設(shè)置Run Loop的運行參數(shù)最多,而且最重要的是可以使用CFRunLoopStop(runLoopRef)來停止Run Loop的運行隘截,而第一個和第三個接口無法使用CFRunLoopStop(runLoopRef)來停止Run Loop的運行。

坑四

在使用NSURLConnection或者NSStream時汹胃,需要考慮到Run Loop的問題婶芭,默認情況下這兩個對象生成后都是運行在當前線程的NSDefaultRunLoopMode模式的,如果是在主線程着饥,那么在滾動ScrollView或者TableView時犀农,主線程的Run Loop會運行在UITrackingRunLoopMode模式,那么NSURLConnection或者NSStream的回調(diào)就無法運行宰掉。因此最好是指定NSURLConnection或NSStream在Run Loop中的運行模式呵哨,兩者有相同的接口- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
來設(shè)置NSURLConnection和NSStream的Run Loop以及模式,而且設(shè)置的Mode要設(shè)置為NSRunLoopCommonModes轨奄,因為NSRunLoopCommonModes默認會包含NSDefaultRunLoopMode和UITrackingRunLoopMode孟害,這樣無論Run Loop運行在哪個模式,都可以保證NSURLConnection或者NSStream的回調(diào)可以被調(diào)用挪拟。另外如果是在子線程中你設(shè)置了自定義的Run Loop模式挨务,還可以用接口CFRunLoopAddCommonMode(runLoopRef, mode)
添加到NSRunLoopCommonModes。

不過NSURLConnection的使用有點特殊玉组,必須使用它的designated initializer - (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately
生成NSURLConnection對象谎柄,而且第三個參數(shù)是否立刻啟動NSURLConnection要設(shè)置為NO,之后再用- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
設(shè)置Run Loop與模式惯雳,再調(diào)用[NSURLConnectionObject start]
啟動朝巫。如果是其他接口生成NSURLConnection,用- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
設(shè)置Run Loop和mode都不會起作用石景。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末劈猿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸵钝,更是在濱河造成了極大的恐慌糙臼,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恩商,死亡現(xiàn)場離奇詭異变逃,居然都是意外死亡,警方通過查閱死者的電腦和手機怠堪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門揽乱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來名眉,“玉大人,你說我怎么就攤上這事凰棉∷鹇#” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵撒犀,是天一觀的道長福压。 經(jīng)常有香客問我,道長或舞,這世上最難降的妖魔是什么荆姆? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮映凳,結(jié)果婚禮上胆筒,老公的妹妹穿的比我還像新娘。我一直安慰自己诈豌,他們只是感情好仆救,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矫渔,像睡著了一般彤蔽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚌斩,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天铆惑,我揣著相機與錄音,去河邊找鬼送膳。 笑死员魏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的叠聋。 我是一名探鬼主播撕阎,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碌补!你這毒婦竟也來了虏束?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤厦章,失蹤者是張志新(化名)和其女友劉穎镇匀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袜啃,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡汗侵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晰韵。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡发乔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雪猪,到底是詐尸還是另有隱情栏尚,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布只恨,位于F島的核電站译仗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏官觅。R本人自食惡果不足惜古劲,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缰猴。 院中可真熱鬧,春花似錦疤剑、人聲如沸滑绒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疑故。三九已至,卻和暖如春弯菊,著一層夾襖步出監(jiān)牢的瞬間纵势,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工管钳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钦铁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓才漆,卻偏偏與公主長得像牛曹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子醇滥,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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