NSRunloop 认识

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的运行方式.

文章引用来源

你可能感兴趣的:(NSRunloop 认识)