【问题标题】:Using NSTimer in swift playground [duplicate]在 Swift Playground 中使用 NSTimer [重复]
【发布时间】:2025-12-17 11:05:01
【问题描述】:

我想知道如何在 Swift Playground 中使用 NSTimerThis question has been asked before,但没有一个答案真正回答了这个问题。

这是我的游乐场代码:

import Foundation

class MyClass {

    func startTimer() {
        NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "onTimer:", userInfo: nil, repeats: true)
    }

    func onTimer(timer:NSTimer!) {
        println("Timer here")
    }
}

var anInstance = MyClass()

anInstance.startTimer()

scheduledTimerWithTimeInterval 实例化NSTimer 会创建计时器在当前运行循环中安排它。

但是方法onTimer 永远不会被调用。为什么?

【问题讨论】:

    标签: swift uikit nstimer foundation swift-playground


    【解决方案1】:

    首先,您的onTimer 方法必须声明为@objc,否则NSTimer 找不到。

    至于你的问题,是因为你还没有启动运行循环。

    为此,CFRunLoopRun() 是我认为最简单的解决方案。

    import Foundation
    
    class MyClass {
    
        func startTimer() {
            NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "onTimer:", userInfo: nil, repeats: true)
        }
    
        @objc func onTimer(timer:NSTimer!) {
            println("Timer here")
        }
    }
    
    var anInstance = MyClass()
    
    anInstance.startTimer()
    
    CFRunLoopRun() // <-- HERE!
    

    为了完整起见,正如评论中提到的@MartinR,您也可以使用XCPSetExecutionShouldContinueIndefinitely()

    import Foundation
    import XCPlayground
    XCPSetExecutionShouldContinueIndefinitely()
    
    class MyClass {
    
        func startTimer() {
            NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "onTimer:", userInfo: nil, repeats: true)
        }
    
        @objc func onTimer(timer:NSTimer!) {
            println("Timer here")
        }
    }
    
    var anInstance = MyClass()
    
    anInstance.startTimer()
    

    在这种情况下,Playground 只运行时间轴中指定的秒数:

    【讨论】:

    • ... 或 XCPSetExecutionShouldContinueIndefinitely()
    • @MartinR 和 import XCPlayground :)
    • 这非常简单,CFRunLoopRun() 行。考虑到NSTimer 的实现方式,这是有道理的。