iOS應(yīng)事件的生命周期

1.手指觸碰屏幕,屏幕感應(yīng)到觸碰后,將事件交由IOKit處理。

2.IOKit將觸摸事件封裝成一個(gè)IOHIDEvent對象,并通過mach port傳遞給SpringBoad進(jìn)程。

mach port 進(jìn)程端口,各進(jìn)程之間通過它進(jìn)行通信。

SpringBoad.app 是一個(gè)系統(tǒng)進(jìn)程,可以理解為桌面系統(tǒng),可以統(tǒng)一管理和分發(fā)系統(tǒng)接收到的觸摸事件。

  1. SpringBoard進(jìn)程因接收到觸摸事件,觸發(fā)了主線程runloop的source1事件源的回調(diào)。

此時(shí)SpringBoard會根據(jù)當(dāng)前桌面的狀態(tài),判斷應(yīng)該由誰處理此次觸摸事件。因?yàn)槭录l(fā)生時(shí),你可能正在桌面上翻頁,也可能正在刷微博。若是前者(即前臺無APP運(yùn)行),則觸發(fā)SpringBoard本身主線程runloop的source0事件源的回調(diào),將事件交由桌面系統(tǒng)去消耗;若是后者(即有app正在前臺運(yùn)行),則將觸摸事件通過IPC傳遞給前臺APP進(jìn)程,接下來的事情便是APP內(nèi)部對于觸摸事件的響應(yīng)了。

APP響應(yīng)階段

1.APP進(jìn)程的mach port接受到SpringBoard進(jìn)程傳遞來的觸摸事件,主線程的runloop被喚醒,觸發(fā)了source1回調(diào)。

2.source1回調(diào)又觸發(fā)了一個(gè)source0回調(diào),將接收到的IOHIDEvent對象封裝成UIEvent對象,此時(shí)APP將正式開始對于觸摸事件的響應(yīng)。

3.source0回調(diào)內(nèi)部將觸摸事件添加到UIApplication對象的事件隊(duì)列中。事件出隊(duì)后,UIApplication開始一個(gè)尋找最佳響應(yīng)者的過程,這個(gè)過程又稱hit-testing,細(xì)節(jié)將在[尋找事件的最佳響應(yīng)者]一節(jié)闡述。另外,此處開始便是與我們平時(shí)開發(fā)相關(guān)的工作了。

4.尋找到最佳響應(yīng)者后,接下來的事情便是事件在響應(yīng)鏈中的傳遞及響應(yīng)了,關(guān)于響應(yīng)鏈相關(guān)的內(nèi)容詳見[事件的響應(yīng)及在響應(yīng)鏈中的傳遞]一節(jié)。事實(shí)上,事件除了被響應(yīng)者消耗,還能被手勢識別器或是target-action模式捕捉并消耗掉。其中涉及對觸摸事件的響應(yīng)優(yōu)先級,詳見[事件的三徒弟UIResponder、UIGestureRecognizer、UIControl]一節(jié)。

5.觸摸事件歷經(jīng)坎坷后要么被某個(gè)響應(yīng)對象捕獲后釋放,要么致死也沒能找到能夠響應(yīng)的對象,最終釋放。至此,這個(gè)觸摸事件的使命就算終結(jié)了。runloop若沒有其他事件需要處理,也將重歸于眠,等待新的事件到來后喚醒。

現(xiàn)在,你可以回答第一個(gè)問題了。觸摸事件從觸屏產(chǎn)生后,由IOKit將觸摸事件傳遞給SpringBoard進(jìn)程,再由SpringBoard分發(fā)給當(dāng)前前臺APP處理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容