Using NSTimer in swift playground [duplicate]

2020-02-29 04:21发布

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条回答
放我归山
2楼-- · 2020-02-29 04:49

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:

screenshot

查看更多
登录 后发表回答