Runloop -運行循環(huán)的簡單介紹

一巍举、特性

  • iOS中所有的事件監(jiān)聽全部是由Runloop負責(zé)監(jiān)聽的脆荷,main線程的Runloop在應(yīng)用啟動的時候就會自動創(chuàng)建,其他子線程需要自己啟動,不會自己創(chuàng)建Runloop
  • 線程和Runloop之間是一一對用的蜓谋,其關(guān)系是保存在一個全局的字典里面苔严,線程剛創(chuàng)建時,并沒有Runloop孤澎,不主動獲取,那么它一直不會有欠窒,Runloop的創(chuàng)建發(fā)生在第一次獲取時覆旭。
  • Runloop并不是線程安全,所以需要避免在其他線程上調(diào)用當前線程的Runloop
  • Runloop負責(zé)管理autorelease pools岖妄,負責(zé)處理消息事件型将,如輸入源事件、計時器事件荐虐,網(wǎng)絡(luò)請求等
  • 通Runloop機制實現(xiàn)省電七兜,流暢、響應(yīng)速度快福扬。用戶體驗好

二腕铸、Runloop Mode

蘋果文檔中提到的 Mode 有五個:

  • NSDefaultRunLoopMode:App默認的Model,主線程是在這個Model下運行的
  • NSConnectionReplyMode:該模式用來監(jiān)控NSConnection對象铛碑。你通常不需要在你的代碼中使用該模式(ios9.0已經(jīng)廢棄NSConnection了狠裹,由NSURLSession替代,所以這個應(yīng)該然并卵了吧)
  • NSModalPanelRunLoopMode: 使用該模式來標識用于modal panel(模態(tài)面板)的事件汽烦。
  • NSEventTrackingRunLoopMode:界面跟蹤Mode涛菠,用于ScrollView追蹤觸摸滑動,保證界面滑動時不受其他Mode影響撇吞。 (當我們滑動ScrollView,TableView等繼承于ScrollView的控件是, 系統(tǒng)會切換模式為: UITrackingRunLoopMode, 跟蹤你的觸摸事件, 當停止?jié)L動的時候, 系統(tǒng)會切換模式為: kCFRunLoopDefaultMode)俗冻,
  • NSRunLoopCommonModes 這是一組可配置的通用模式。將input sources與該模式關(guān)聯(lián)則同時也將input sources與該組中的其它模式進行了關(guān)聯(lián)牍颈。對于Cocoa應(yīng)用迄薄,該模式缺省的包含了default,modal以及event tracking模式煮岁。

iOS公開出來的只有兩個:


mode.png

一個常見的問題就是噪奄,主線程中一個NSTimer添加在default mode中,當界面上有一些scroll view的滾動頻繁發(fā)生導(dǎo)致run loop運行在UItraking mode中人乓,從而這個timer沒能如期望那般的運行勤篮。所以,我們就可以把這個timer加到NSRunLoopCommonModes中來解決
舉個栗子: 如果有TableView上有輪播圖(NSTimer), 則在滾動TableView的時候,定時器是不好使的, 因為添加定時器默認是在kCFRunLoopDefaultMode下的

三色罚、Runloop 應(yīng)用

如果我們將定時器放到UITrackingRunLoopMode
模式下, 則只有在拖動的時候,定時器才可以工作, 代碼如下:

// 調(diào)用了scheduledTimer返回的NSTimer的定時器對象,已經(jīng)被自動添加到當前的runLoop中(一個線程對應(yīng)一個runloop,如果在子線程中添加定時器..添加到子線程的runloop中),默認為NSDefaultRunLoopMode模式
        let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(printAction), userInfo: nil, repeats: true)
        RunLoop.current.add(timer, forMode: .UITrackingRunLoopMode)
        
        // 如果需要更改模式, 直接這樣就可以
        RunLoop.current.add(timer, forMode: .commonModes)```

iOS 10 加入新閉包形式的寫法碰缔,

// NSDefaultRunLoopMode:NSTimer只有在默認模式下(NSDefaultRunLoopMode)工作,切換到其他模式不再工作戳护,比如拖拽了界面上的某個控件(會切換成UITrackingRunLoopMode)
let timer = Timer.init(timeInterval: 1, repeats: true) { (timer) in
print("新timer執(zhí)行了")
}
RunLoop.current.add(timer, forMode: .defaultRunLoopMode)```

CADisplayLink如果NSTimer一樣, 也是添加到模式中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末金抡,一起剝皮案震驚了整個濱河市瀑焦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梗肝,老刑警劉巖榛瓮,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巫击,居然都是意外死亡禀晓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門坝锰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粹懒,“玉大人,你說我怎么就攤上這事顷级≠旃裕” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵弓颈,是天一觀的道長帽芽。 經(jīng)常有香客問我,道長翔冀,這世上最難降的妖魔是什么嚣镜? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮橘蜜,結(jié)果婚禮上菊匿,老公的妹妹穿的比我還像新娘。我一直安慰自己计福,他們只是感情好跌捆,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著象颖,像睡著了一般佩厚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上说订,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天抄瓦,我揣著相機與錄音,去河邊找鬼陶冷。 笑死钙姊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的埂伦。 我是一名探鬼主播煞额,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了膊毁?” 一聲冷哼從身側(cè)響起胀莹,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婚温,沒想到半個月后描焰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡栅螟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年荆秦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嵌巷。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖室抽,靈堂內(nèi)的尸體忽然破棺而出搪哪,到底是詐尸還是另有隱情,我是刑警寧澤坪圾,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布晓折,位于F島的核電站,受9級特大地震影響兽泄,放射性物質(zhì)發(fā)生泄漏漓概。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一病梢、第九天 我趴在偏房一處隱蔽的房頂上張望胃珍。 院中可真熱鬧,春花似錦蜓陌、人聲如沸觅彰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽填抬。三九已至,卻和暖如春隧期,著一層夾襖步出監(jiān)牢的瞬間飒责,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工仆潮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宏蛉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓性置,卻偏偏與公主長得像檐晕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

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

  • Run loop 剖析:Runloop 接收的輸入事件來自兩種不同的源:輸入源(intput source)和定時...
    Mitchell閱讀 12,422評論 17 111
  • RunLoop 是 iOS 和 OS X 開發(fā)中非潮倩遥基礎(chǔ)的一個概念,面試中我們經(jīng)常會被問到 1.RunLoop 的...
    浩瀚海洋里的木頭閱讀 4,446評論 6 14
  • 轉(zhuǎn)自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飄金閱讀 976評論 0 4
  • 深入理解RunLoop 由ibireme| 2015-05-18 |iOS,技術(shù) RunLoop 是 iOS 和 ...
    橙娃閱讀 849評論 1 2
  • 每個創(chuàng)業(yè)這都需打起120的精神个榕,像在Linckia海星客(www.linckia.cn)這樣專門為創(chuàng)業(yè)人士提供辦公...
    skyjun閱讀 228評論 1 1