1. runloop是什么奥邮?
a. ?Runloop是事件接收和分發(fā)機制的一個實現域携。
b. ?一個runloop就是一個事件處理循環(huán)琉用,用來不停的調配工作以及處理輸入事件焊傅。
c.? runloops是線程的基礎架構部分。使用run loop的目的是使你的線程在有工作的時候工作摊唇,沒有的時候休眠咐蝇。
d. ?在任何情況,Runloop都不需要手動創(chuàng)建(alloc)巷查,如果需要獲取當前線程中的runloop有序,只需要currentRunLoop即可。
e. ?在主線程中,系統(tǒng)默認創(chuàng)建并且啟動主線程runloop岛请。
? ? ?但是在分線程中旭寿,系統(tǒng)不會默認啟動runloop,需要手動啟動。
f. ?主線程中的runloop,默認mode是default
簡單來說:Runloop是事件循環(huán)處理機制崇败。有事情的時候就去做盅称,沒事就休眠。
2. runloop的mode有什么用后室?
? a. ? 主線程runloop默認是default缩膝,runloop還有NSRunLoopCommonModes,UITrackingRunLoopMode等模式岸霹。
? ? NSRunLoopCommonModes:一組配置模式疾层。
? ? UITrackingRunLoopMode: 滾動視圖滾動的模式。
? b. ?情況1:當tableView\CollectionView\ScrollView滑動的時候為什么NSTimer停止贡避?
原因:當滾動視圖滾動的時候痛黎,當前runloop處于UITrackingRunLoopMode。一個runloop不能同時共存在于2個模式贸桶。當前runloop處理滾動視圖的事件舅逸。
修改timer在runloop中的模式與滾動視圖在runloop中的模式一致為:UITrackingRunLoopMode。
代碼:
[[NSRunLoopcurrentRunLoop] addTimer: timer forMode:UITrackingRunLoopMode];
3. 如果NSTimer在分線程中創(chuàng)建應該注意
a. ? 子線程中runloop不會啟動
[NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(update)userInfo:nilrepeats:YES];
需要啟動分線程中的runloop
[[NSRunLoopcurrentRunLoop]run];