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.