RunLoop 只能运行在一种 mode 下,如果要换 mode,当前的 loop 也需要停下重启成新的。利用这个机制,ScrollView 滚动过程中 NSDefaultRunLoopMode(kCFRunLoopDefaultMode)的 mode 会切换到 UITrackingRunLoopMode 来保证 ScrollView 的流畅滑动:只能在 NSDefaultRunLoopMode 模式下处理的事件会影响 ScrollView 的滑动。
如果我们把一个 NSTimer 对象以 NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView 滚动过程中会因为 mode 的切换,而导致 NSTimer 将不再被调度。
Timer 计时会被 scrollView 的滑动影响的问题可以通过将 timer 添加到 NSRunLoopCommonModes(kCFRunLoopCommonModes)来解决。
// 默认情况:将 timer 添加到 NSDefaultRunLoopMode 中:
[NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(timerTick:)
userInfo:nil
repeats:YES];
// 手动将 timer 添加到 NSRunLoopCommonModes 里:
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0
target:self
selector:@selector(timerTick:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
更多:iOS面试题合集