在快速操场上使用NSTimer

时间:2015-03-24 12:10:52

标签: swift uikit nstimer foundation swift-playground

我想知道如何在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。为什么?

1 个答案:

答案 0 :(得分:12)

首先,您的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仅运行时间轴中指定的秒数:

screenshot