【问题标题】:Timer does not run in Swift 3.0 playground计时器不在 Swift 3.0 操场上运行
【发布时间】:2016-10-14 19:34:23
【问题描述】:

在操场上使用 Swift 3.0 我有这个代码:

struct Test {
    func run() {
        var timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { timer in
            print("pop")
        }
    }
}

let test = Test()
test.run()

但是没有任何东西打印到控制台。我已经阅读了How can I use NSTimer in Swift?,并且我在在线答案和教程中看到的大多数计时器的使用都涉及选择器,所以我尝试了这个:

class Test {
    func run() {
        var timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.peep), userInfo: nil, repeats: false)
    }

    @objc func peep() {
        print("peep")
    }
}

let test = Test()
test.run()

似乎仍然没有打印到控制台。如果我添加timer.fire(),那么我会得到控制台打印,但显然这违背了目的。 我需要更改什么才能让计时器运行?

编辑:

所以在我为我的Test 结构调用run 方法之后添加CFRunLoopRun() 就可以了。非常感谢那些回答的人,尤其是@AkshayYaduvanshi(他的评论将我指向CFRunLoopRun())和@JoshCaswell(他们的回答提出了我的计时器仅适用于运行循环的事实)。

【问题讨论】:

  • “在操场上工作”这就是问题所在。
  • 查看link

标签: swift cocoa nstimer swift-playground


【解决方案1】:

如果您允许 Playground 通过PlaygroundSupport 无限期运行,您的第一个版本就可以工作:

import Foundation
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true 

let timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { timer in
  print("Timer Fired at: \(timer.fireDate)")
}

手动添加运行循环也可以,有时可能需要,但在您的情况下,这个简单的指令足以使 Timer 正常工作。

【讨论】:

    【解决方案2】:

    你需要启动一个运行循环。

    RunLoop.main.run(until: Date(timeIntervalSinceNow: 3))
    

    除非有一个有效的运行循环接受输入,否则计时器不会做任何事情。程序就这样结束了。

    Timer reference:

    定时器与运行循环一起工作。 [...] 它仅在添加了计时器的运行循环模式之一正在运行并且能够检查计时器的触发时间是否已过时触发。

    【讨论】:

    • 感谢您的快速响应。我在参考文献中错过了这一点,我必须做一些阅读和测试才能确定,但​​这似乎是问题,因为我根本没有使用 runloops。
    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多