NSTimer有两种常用的创建方式

// 第一种
timer = [NSTimer timerWithTimeInterval:1
                 target:self 
                 selector:@selector(timerSelector:)
                 userInfo:nil 
                 repeats:YES];

[[NSRunLoop currentRunLoop] addTimer: timer] forMode:NSRunLoopCommonModes];

// 第二种
timer = [NSTimer scheduledTimerWithTimeInterval:1 
                 target:self 
                 selector:@selector(timerSelector:) 
                 userInfo:nil 
                 repeats:YES];

第二种方式timer会被默认加入到当前线程的RunLoop,而RunLoop的mode为NSDefaultRunLoopMode。这种情况下当进行RunLoop的切换时(切换到其他RunLoopMode)会影响Timer的调用。

第一种方式,需要手动将Timer加入到RunLoop,加入的mode为NSRunLoopCommonModes,这个模式是其余四中模式的集合,所以在进行RunLoop切换时也不会影响到Timer的调用。

RunLoop的模式有:

1. kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行

2. UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响

3. UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用

4. GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到

5. kCFRunLoopCommonModes: 这是一个占位用的Mode,作为标记kCFRunLoopDefaultMode和UITrackingRunLoopMode用,并不是一种真正的Mode


0 Comments latest

No comments.