緣由: 或許也許大概是因?yàn)閷憳I(yè)務(wù)太無聊了倚喂,決定和新來的同事一起搞點(diǎn)事情巷帝。最后我們決定根據(jù)官方文檔整理一下 CFRunLoop 的相關(guān)知識(后續(xù)待定...),在閱讀過程中我決定嘗試翻譯一下瘩例,話不多說矢劲,這就開始赦拘。
CFRunLoop 對象負(fù)責(zé)監(jiān)測輸入源并將它們作為"任務(wù)"加入隊(duì)列,并且對隊(duì)列中的任務(wù)進(jìn)行分發(fā)控制芬沉。
輸入源包括輸入設(shè)備躺同、網(wǎng)絡(luò)任務(wù)、周期性或延遲性事件以及異步回調(diào)丸逸。runLoop 可以監(jiān)監(jiān)測3種對象:CFRunLoopSource蹋艺、CFRunLoopTimer、CFRunLoopObserver黄刚。你必須通過
CFRunLoopAddSource()
捎谨、CFRunLoopAddTimer()
或CFRunLoopAddObserver()
方法將他們加入 runLoop 來監(jiān)聽它們在隊(duì)列中執(zhí)行時(shí)的回掉,你能夠?qū)⑺鼈円瞥?runLoop 從而放棄監(jiān)聽隘击。這些對象被加入 runLoop 時(shí)必須關(guān)聯(lián)一個(gè)或者多個(gè) CFRunLoopMode。runLoop 每次只會運(yùn)行在一個(gè) mode(模式) 中研铆,且隊(duì)列中只關(guān)聯(lián)當(dāng)前 mode 的事件埋同,runLoop 默認(rèn)運(yùn)行在
defaultMode
(負(fù)責(zé)線程日常空閑的任務(wù)分配)棵红,系統(tǒng)也定義了一些其他的 mode 來對其他的任務(wù)進(jìn)行分發(fā)(例如監(jiān)聽 UIScrollerView 的滑動在trackingMode
: 其實(shí)是 NSRunLoop 中的 mode)凶赁,由于 runLoop 的 mode 本質(zhì)是規(guī)定一個(gè)字符串常量座位唯一標(biāo)識符,你也可以自定義一個(gè) mode 來控制任務(wù)隊(duì)列逆甜。Core Foundation 中還定義了一個(gè)特別的 mode: commonModes虱肄。他表示 mode 的一個(gè)集合(包含當(dāng)前 runLoop 中的 mode ,每一個(gè) runLoop 都有自己的 commonModes 并且默認(rèn)含有
defaultMode
)交煞,調(diào)用CFRunLoopAddCommonMode()
方法可以向 commonModes 中添加 mode咏窿。一個(gè)線程僅有唯一確定的一個(gè)runLoop,你無法更改線程所對應(yīng)的 runLoop素征,Core Foundation 會在你需要的時(shí)候自動創(chuàng)建 runLoop集嵌,你只能通過
CFRunLoopGetCurrent()
方法來獲得當(dāng)前 runLoop。CFRunLoopRun()
使其在defaultMode
運(yùn)行御毅、CFRunLoopRunInMode()
則可以指定 mode 運(yùn)行根欧,CFRunLoopStop()
使 runLoop 停止。只要 runLoop 隊(duì)列中有一個(gè)任務(wù)端蛆,該 runLoop 就能夠運(yùn)行凤粗。runLoop 能夠遞歸調(diào)用。你能夠在任意 runLoop 執(zhí)行時(shí)使用
CFRunLoopRun()
或CFRunLoopRunInMode()
在當(dāng)前線程創(chuàng)建一個(gè)子 runLoop 然后在當(dāng)前線程調(diào)用棧中激活子 runLoop今豆。并且你可以不受限制的讓它以任何 mode 運(yùn)行(只要是你可以獲得到的 mode)嫌拣。Cocoa Touch 基于 CFRunLoop 實(shí)現(xiàn)了一個(gè)高等的事件循環(huán)機(jī)制 (NSRunLoop)柔袁。我們實(shí)際開發(fā)時(shí)可以向 NSRunLoop 實(shí)例中添加 sources、timers 以及 observers 并且指定 mode亭罪,他們就會成為應(yīng)用的事件循環(huán)中的一部分瘦馍。
getCFRunLoop()
方法可獲得當(dāng)前 runLoop 相應(yīng)的 CFRunLoop 類型。
ps: 第一次翻譯应役,表示看的懂不代表能夠流暢的用英文翻譯出來情组。如有錯(cuò)誤,謝謝指正箩祥。
下節(jié)介紹 CFRunLoop 中的 API...