问题
I'd like to know how to use an NSTimer
inside a Swift Playground. This question has been asked before, but none of the answers actually answered the question.
Here's my Playground code:
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()
Instantiating NSTimer
with scheduledTimerWithTimeInterval creates the timer and schedules it on the current run loop.
But the method onTimer
is never called. Why?
回答1:
First of all, your onTimer
method have to be declared as @objc
, or NSTimer
cannot find that.
As for your question, it's because you haven't started the run loop.
To do that, CFRunLoopRun()
is the simplest solution I think.
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!
For the sake of completeness, as @MartinR metioned in the comment, you can also use 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()
In this case the Playground runs only seconds specified in the Timeline:

来源:https://stackoverflow.com/questions/29232334/using-nstimer-in-swift-playground