timer和runloop
runloop的模式分为5种
系统默认定义了多种运行模式(CFRunLoopModeRef),如下:
kCFRunLoopDefaultMode:App的默认运行模式,通常主线程是在这个运行模式下运行
UITrackingRunLoopMode:跟踪用户交互事件(用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他Mode影响)
UIInitializationRunLoopMode:在刚启动App时第进入的第一个 Mode,启动完成后就不再使用
GSEventReceiveRunLoopMode:接受系统内部事件,通常用不到
kCFRunLoopCommonModes:伪模式
- (void)viewDidLoad {
[super viewDidLoad];
// 定义一个定时器,约定两秒之后调用self的run方法
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
// 将定时器添加到当前RunLoop的NSDefaultRunLoopMode下
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}
- (void)run
{
NSLog(@"---run");
}
当滑动scrollview时timer的run方法就停止调用,因为当前的mode为default模式,当交互时需要开启tracking模式,但是,不滑动时,run方法停止调用.现在如果要求在滑动,还有没用用户交互时都可以正常的调用run方法,就需要制定runloop模式为Common模式.因为common为标记模式,defaul和tracking方法都被标记为Common模式
NSTimer 还有另外一种写法
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
相当于下面两句
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
如果是要指定两种模式下都可以运行时,用第一种方式指定timer的运行方式.