iosrunloop機(jī)制 如何解決靜態(tài)頁(yè)面在ios上的滑動(dòng)卡頓?
如何解決靜態(tài)頁(yè)面在ios上的滑動(dòng)卡頓?這個(gè)問(wèn)題的本質(zhì)可以追溯到IOS runloop。滑動(dòng)時(shí),runloop切換模式。默認(rèn)情況下,nstimer和Scrollview的滑動(dòng)以?xún)煞N模式執(zhí)行,這可以通過(guò)兩
如何解決靜態(tài)頁(yè)面在ios上的滑動(dòng)卡頓?
這個(gè)問(wèn)題的本質(zhì)可以追溯到IOS runloop?;瑒?dòng)時(shí),runloop切換模式。默認(rèn)情況下,nstimer和Scrollview的滑動(dòng)以?xún)煞N模式執(zhí)行,這可以通過(guò)兩種方式解決:
runloop中的source0和source1分別處理什么時(shí)間?
source1 Apple創(chuàng)建一個(gè)系統(tǒng)來(lái)接受系統(tǒng)發(fā)送的事件。當(dāng)手機(jī)上發(fā)生觸摸、震動(dòng)或鎖定時(shí),系統(tǒng)將向應(yīng)用程序進(jìn)程(進(jìn)程通信)發(fā)送事件。這就是為什么它被稱(chēng)為基于端口的source1交付。端口是進(jìn)程端口,它可以在進(jìn)程中激活線(xiàn)程的runloop,比如在屏幕上點(diǎn)擊應(yīng)用程序的按鈕或屏幕,runloop就會(huì)被喚醒來(lái)處理觸摸事件。你可以做個(gè)實(shí)驗(yàn)。向主線(xiàn)程的runloop中添加一個(gè)cfrunloop obserref,并使用switch輸出六個(gè)runloop狀態(tài)。此時(shí),每次點(diǎn)擊屏幕,它都會(huì)輸出六個(gè)runloop狀態(tài),然后進(jìn)入睡眠狀態(tài)。
source0:執(zhí)行performselectors方法。如果在主線(xiàn)程performselectors中對(duì)子線(xiàn)程執(zhí)行任務(wù),則會(huì)在代碼中將事件發(fā)送到子線(xiàn)程的runloop。此時(shí),如果子線(xiàn)程打開(kāi)runloop,任務(wù)將被執(zhí)行。注意,performselector方法只能在子線(xiàn)程打開(kāi)runloop時(shí)執(zhí)行。如果不在子線(xiàn)程中打開(kāi)runloop,操作將失敗并崩潰。
以上是我個(gè)人的理解。如果你有任何問(wèn)題,請(qǐng)指出!