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