当前位置: 代码迷 >> 综合 >> iOS开发笔记 以 schedcledTimerWithTimerInterval…的方式触发的 timer,在滑动页面上的列表时,timer 会暂停回调,为什么?如何解决?
  详细解决方案

iOS开发笔记 以 schedcledTimerWithTimerInterval…的方式触发的 timer,在滑动页面上的列表时,timer 会暂停回调,为什么?如何解决?

热度:115   发布时间:2023-10-17 12:55:54.0

遇到的问题: 

timer 本身不能自动循环的做一些事, 必须把它加入到消息循环后才能处理一些事情, 而用 scheduleTimerWithTimeInterval 的方式创建的 timer 做了两件事情: 

1. 创建了 NSTimer 对象

2. 把这个 timer 加入到当前 RunLoop 的 NSDefaultRunLoopMode 中

因为线程一般情况下就是 NSDefaultRunLoopMode 模式, 而刚用 scheduleTimerWithTimeInterval 方式创建的 timer 也是加入到 NSDefaultRunLoopMode 中的, 因此子啊平时情况下, NSTimer 都能正常工作, 但当你在界面上进行滑动时, 当前的 RunLoop 会立即进入 UITrachingRunLoopMode 模式, 此时与 timer 所加入的模式并不是同一种, 因此 timer 就会暂时停止回调, 直到停止滑动, 从 UITrachingRunLoopMode 转回 NSDefaultRunLoopMode 时才能继续正常工作. 


解决办法: 

用 scheduleTimerWithTimeInterval 的方式创建完 timer 对象后, 立即获取当前线程的 RunLoop, 然后添加 timer 到 NSRunLoopCommomModes 中, 因为 NSRunLoopCommomModes 模式代表把 timer 加入到所具有"Common"属性标记的模式中. 而 NSDefaultRunLoopMode 和 UITrachingRunLoopMode 这两种模式都具有"Common"属性标记.