runloop 運行著的線程循環(huán)批钠。用來接受循環(huán)中的事件和安排線程工作宇植,并在沒有工作時,讓線程進入睡眠狀態(tài)埋心。
Run Loop從兩個不同的事件源中接收消息:
Input source用來投遞異步消息指郁,通常消息來自另外的線程或者程序。在接收到消息并調(diào)用程序指定方法時踩窖,線程中對應(yīng)的NSRunLoop對象會通過執(zhí)行runUntilDate:方法來退出坡氯。
Timer source用來投遞timer事件(Schedule或者Repeat)中的同步消息。在處理消息時洋腮,并不會退出Run Loop箫柳。
Run Loop還有一個觀察者Observer的概念,可以往Run Loop中加入自己的觀察者以便監(jiān)控Run Loop的運行過程啥供。
Run Loop Modes
Run Loop Mode可以理解為一個集合中包括所有要監(jiān)視的事件源和要通知的Run Loop中注冊的觀察者悯恍。每一次運行自己的Run Loop時,都需要顯示或者隱示的指定其運行于哪一種Mode伙狐。在設(shè)置Run Loop Mode后涮毫,你的Run Loop會自動過濾和其他Mode相關(guān)的事件源,而只監(jiān)視和當(dāng)前設(shè)置Mode相關(guān)的源(通知相關(guān)的觀察者)贷屎。
1) NSDefaultRunLoopMode: 大多數(shù)工作中默認的運行方式罢防。
2) NSConnectionReplyMode: 使用這個Mode去監(jiān)聽NSConnection對象的狀態(tài),我們很少需要自己使用這個Mode唉侄。
3) NSModalPanelRunLoopMode: 使用這個Mode在Model Panel情況下去區(qū)分事件(OS X開發(fā)中會遇到)咒吐。
4) UITrackingRunLoopMode: 使用這個Mode去跟蹤來自用戶交互的事件(比如UITableView上下滑動)。
5) GSEventReceiveRunLoopMode: 用來接受系統(tǒng)事件,內(nèi)部的Run Loop Mode恬叹。
6) NSRunLoopCommonModes: 這是一個偽模式候生,其為一組run loop mode的集合。如果將Input source加入此模式绽昼,意味著關(guān)聯(lián)Input source到Common Modes中包含的所有模式下唯鸭。在iOS系統(tǒng)中NSRunLoopCommonMode包含NSDefaultRunLoopMode、NSTaskDeathCheckMode硅确、UITrackingRunLoopMode.可使用CFRunLoopAddCommonMode方法向Common Modes中添加自定義mode片择。