在Swift Playground中使用NSTimer

4
我希望您能告诉我如何在Swift Playground中使用NSTimer。此前曾有人提出类似问题,但是没有一个答案实际回答了这个问题。
以下是我的Playground代码:
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个回答

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


1
...或者XCPSetExecutionShouldContinueIndefinitely() - Martin R
@MartinR 与 import XCPlayground :) - rintaro
这非常简单,CFRunLoopRun() 这行代码。考虑到 NSTimer 的实现方式,这是有道理的。 - Nate Symer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接