使多次创建的计时器无效

Posted

技术标签:

【中文标题】使多次创建的计时器无效【英文标题】:Invalidating a Timer created multiple times 【发布时间】:2022-01-23 18:24:39 【问题描述】:

我试图使在一个类中多次创建的Timer 无效。首先我创建了一个全局定时器;

var musicTimer: Timer?

我发起它。

self.musicTimer = Timer.scheduledTimer(
    timeInterval: 2.0,
    target: self,
    selector: #selector(startMusicOnCorrectTime),
    userInfo: nil,
    repeats: true)

然后我需要使计时器无效,因为我需要停止调用函数。

self.musicTimer?.invalidate()

然后我需要用相同的参数重新创建这个计时器。

self.musicTimer = Timer.scheduledTimer(
    timeInterval: 2.0,
    target: self,
    selector: #selector(startMusicOnCorrectTime),
    userInfo: nil,
    repeats: true)

但这一次当我需要使其无效时,我不能。在课程生命周期中,我多次需要这个序列,而且数量不准确。

【问题讨论】:

“你不能”是什么意思?是否有错误消息或类似的东西?你能显示minimal reproducible example吗? 我知道失效的定时器不能再次使用,所以我要问的是如何使重新创建的定时器失效。 当您尝试使第二个实例无效时遇到什么错误? 没有错误,计时器没有失效。它继续工作。 您需要发布使问题可重现或至少更好地解释导致此问题的事件的代码。 【参考方案1】:

没有完整的代码示例很难说,但这里有一个想法。如果您从与启动它不同的线程调用invalidate(例如,您在主线程上启动它但在后台线程上使其无效),它不会根据the docs 工作:

您必须从安装了计时器的线程发送此消息。如果您从另一个线程发送此消息,与计时器关联的输入源可能不会从其运行循环中删除,这可能会阻止线程正常退出。

【讨论】:

以上是关于使多次创建的计时器无效的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:在设备方向上重绘会使计时器无效

进入后台时使 NSTimer 无效

快速无效计时器不起作用

使 UIViewController 中的 NSTimer 无效以避免保留周期的最佳时间

NSTimer 错误访问

当我使用 popOver 时,NSTimer 似乎无效