RunLoop
2017-05-19 本文已影响6人
CharlyZheng
1. NSTimer 被UIScrollView暂停
当界面同时存在有定时器和UIScrollView时,比如:一个界面顶部是一个由定时器控制的无限轮播图,下面是一个UIScrollView,这时你如果拖动下面UIScrollView,定时器就会暂停,等UIScrollView的拖动事件结束后定时器才会接着执行。
当你创建输入源(Timer)的时候,需要将其分配给 runloop 中的一个或多个模式。改Timer只会在改特定模式下被触发。
****下面的方法 timer 被添加到 NSDefaultRunLoopMode****
timer = [NSTimer scheduledTimerWithTimeInterval:10.0
target:self
selector:@selector(getNotificationNews)
userInfo:nil
repeats:YES];
****下面的方法 timer 被添加到 NSRunLoopCommonModes****
timer = [NSTimer timerWithTimeInterval:10.0
target:self
selector:@selector(getNotificationNews)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
-
NSDefaultRunLoopMode
:将NSTimer添加到主线程NSRunLoop的默认模式下,只有主线程是默认模式下才能执行NSTimer(滚动scrollView,RunLoop默认进入Tracking模式,所以NSTimer不会有效果)。 -
UITrackingRunLoopMode
:将NSTimer添加到主线程NSRunLoop的追踪模式下,只有主线程是追踪模式下才能执行NSTimer。(例如滚动scrollView的时候就会监听到计时器) -
NSRunLoopCommonModes
:Common是一个表示,它是将NSDefaultRunLoopMode 和 UITrackingRunLoopMode标记为了Common
所以,只要将 timer 添加到 Common 占位模式下,timer就可以在Default和UITrackingRunLoopMode模式下都能运行