iOS面试题:以 + scheduledTimerInterval... 的方式触发的 timer,在滑动页面上的列表时,timer 会暂定回调,为什么?如何解决?WithTime

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面试题合集

你可能感兴趣的:(iOS面试题:以 + scheduledTimerInterval... 的方式触发的 timer,在滑动页面上的列表时,timer 会暂定回调,为什么?如何解决?WithTime)