You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scheduledTimer(withTimeInterval)在UI交互时仍运行的疑问

关于iOS 16.1模拟器中NSTimer在UI交互时仍触发的问题

核心原因:iOS 16+对RunLoop模式的调整

从iOS 16开始,苹果对RunLoop的行为做了优化——当你用scheduledTimer(withTimeInterval: 0.008)这类默认方法创建定时器时,系统会自动将定时器同时加入到.default和.common模式的RunLoop中,而非仅绑定.default模式。而UI交互时RunLoop会切换到.tracking模式(属于.common模式的子集),所以定时器依然能正常触发。

旧行为与新变化的差异

你看到的文章描述的是iOS 16之前的逻辑:默认创建的NSTimer只会绑定到RunLoop的.default模式,当用户进行UI交互时,RunLoop会切换到.tracking或.modal模式,此时.default模式下的定时器会暂停。但iOS 16的改动让默认创建的定时器同时关联了.common模式,自然不会在UI交互时停摆。

验证旧行为的方式

如果想复现文章里描述的旧逻辑,可以手动将定时器仅添加到.default模式的RunLoop中,代码示例:

let timer = Timer(timeInterval: 0.008, repeats: true) { _ in
    // 定时器执行逻辑
}
RunLoop.current.add(timer, forMode: .default)

此时再进行UI交互,定时器就会暂停,和文章描述的旧行为一致。

关于CADisplayLink的补充

你切换到CADisplayLink的.common模式是更合理的选择,它的触发频率会和屏幕刷新率同步(比如120Hz设备就是每秒120次),比固定0.008秒(约125次/秒)的定时器更贴合硬件特性,也更高效,能避免不必要的冗余触发。

内容的提问来源于stack exchange,提问作者Anton Tropashko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:35:18