iOS NSTimer 什麼時候需要使用NSRunLoopCommonModes

當使用NSTimer的scheduledTimerWithTimeInterval方法時。此時Timer會被加入到當前線程的Run Loop中,且模式是默認的NSDefaultRunLoopMode。而如果當前線程就是主線程(UI線程時),某些UI事件,比如UIScrollView的拖動操作,會將Run Loop切換成UITrackingRunLoopMode模式,在這個過程中,默認的NSDefaultRunLoopMode模式中註冊的事件是不會被執行的。也就是說此時使用scheduledTimerWithTimeInterval添加到Run Loop中的Timer就不會執行。

所以爲了設置一個不被UI線程干擾的Timer,我們需要手動創建一個Timer,然後使用NSRunLoop的addTimer:forMode:方法來把Timer按照指定模式加入到Run Loop中。這裏使用的模式是:NSRunLoopCommonModes,這個模式等效於NSDefaultRunLoopMode和UITrackingRunLoopMode的結合。

比如滑動UIScrollView的時候,NSTimer的處理時間根本沒有調用,當鬆手的時候,又執行了。 原因:當滑動UIScrollView的時候,RunLoop切換成UITrackingRunLoopMode模式,而NSTimer默認註冊NSDefaultRunLoopMode模式,所以拖動時Timer不執行。

使用以下方法滑動是沒有影響的。

NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(Handlete) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章