一、造成NSTimer觸發(fā)不準(zhǔn)確的原因
- 在
run loops循環(huán)過(guò)程中,被NSTimer觸發(fā)事件阻塞了,導(dǎo)致循環(huán)不能及時(shí)進(jìn)行下去,延誤之后NSTimer觸發(fā)時(shí)間。 - 在
run loops循環(huán)過(guò)程中,在某一時(shí)刻主線程發(fā)生了阻塞情況,導(dǎo)致循環(huán)不能及時(shí)進(jìn)行下去,厭惡NSTimer觸發(fā)時(shí)間。 - 在
run loops循環(huán)過(guò)程中,發(fā)生了模式的轉(zhuǎn)換,(比如UIScrollView的滑動(dòng)) 導(dǎo)致原有模式下的NSTimer不會(huì)正常觸發(fā)。
以上情況都是由于NSTimer所依賴的run loops會(huì)被多種原因干擾正常循環(huán),所以要想解決NSTimer精度問(wèn)題,就要避免所依賴的run loops被外界干擾。
- 注意:雖然第三種情況可以指定
NSTimer所處模式為NSRunLoopCommonModes,但是這種解決方法并不能改變run loops在特定模式下不能處理其余模式事件的本質(zhì)。
二、終極解決辦法
- 盡量避免將
NSTimer放入容易受到影響的主線程run loops中。 - 盡量避免將耗時(shí)操作放入
NSTimer依賴的線程中。 - 盡量避免在
NSTimer觸發(fā)事件中進(jìn)行耗時(shí)操作,如果不能避免,將耗時(shí)操作移至其余線程進(jìn)行。