在 Swift 中休眠或延迟 Timer 线程

Posted

技术标签:

【中文标题】在 Swift 中休眠或延迟 Timer 线程【英文标题】:Sleep or delay a Timer thread in Swift 【发布时间】:2017-03-12 01:17:48 【问题描述】:

我一直在尝试在自重复计时器上创建一两秒的延迟。这就是我创建计时器的方式:

currentThread = Timer.scheduledTimer(timeInterval: 0.001, target: self, selector: #selector(Movement.updatePosition), userInfo: nil, repeats: true)

所以计时器不断运行方法updatePosition()。但是,我在该方法中有一个 if 语句,我希望将计时器延迟几秒钟:

if distance <= respawnDistance * 0.1 
    // Delay timer for 1 second     

我在想我可以这样做:

currentThread.invalidate()

然后只需创建另一个在 1 秒后运行的计时器,这会导致前一个计时器的重新激活。但是,我认为如果有办法让当前定时器休眠,那效率会很低吗?

【问题讨论】:

你可以使用一个无限循环来调用 updatePosition 方法,并且只有一个 1 秒的计时器吗?这可能不是最有效的方法... 我想知道updatePosition 做了什么。如果这是某种动画,请使用动画,而不是计时器。 你只需要一个布尔变量。 【参考方案1】:

NSTimer 并不准确。它的最大分辨率约为 50 - 100 毫秒。总之,你可以添加一个变量来控制定时器的触发:

var doNotUpdate = false

if distance <= respawnDistance * 0.1 
    doNotUpdate = true
    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) 
        doNotUpdate = false
    


func updatePosition() 
    if doNotUpdate  return 

    // update your position

【讨论】:

我还注意到计时器不准确。谢谢

以上是关于在 Swift 中休眠或延迟 Timer 线程的主要内容,如果未能解决你的问题,请参考以下文章

util包下Timer类的延迟执行

java中如何是方法延迟执行?

多线程 - Swift 中的 DispatchQueue asyncAfter 延迟

【Swift】iOS中的定时器

swift延迟后如何更新UI

Timer 的简单使用