Swift Playground中的NSTimer.scheduledTimerWithTimeInterval

问题描述 投票:6回答:4

我在Swift中使用“ NSTimer.scheduledTimerWithTimeInterval”看到的所有示例都使用“ target:self”参数显示,但不幸的是,这在Swift Playgrounds中无法直接使用。

Playground execution failed: <EXPR>:42:13: error: use of unresolved
identifier 'self'
  target: self,

这是上面引用的导致错误的示例:

func printFrom1To1000() {
    for counter in 0...1000 {
        var a = counter        
    }
}

var timer = NSTimer.scheduledTimerWithTimeInterval(0,
    target: self,
    selector: Selector("printFrom1To1000"),
    userInfo: nil,
    repeats: false
    )
timer.fire()
swift nstimer swift-playground
4个回答
8
投票

这些天您确实不应该使用NSTimer。它消耗大量资源,导致不必要的电池消耗,并且该API使其自身适用于难看的代码。

改为使用dispatch_after()

dispatch_after(0, dispatch_get_main_queue()) { () -> Void in
  for counter in 0...1000 {
    var b = counter
  }
}

当然,由于计时器将在游乐场完成后触发,因此您将需要等价的timer.fire()来强制代码立即执行,而不是在延迟0秒之后执行。这是这样的:

let printFrom1To1000 = { () -> Void in
  for counter in 0...1000 {
    var b = counter
  }
}

dispatch_after(0, dispatch_get_main_queue(), printFrom1To1000)

printFrom1To1000()

3
投票

要使其直接在Swift Playground中运行,您需要将printFrom1To1000函数嵌入一个类中,然后将该类的实例设置为“ target:”参数,而不要使用“ self”。

这是一个完整的工作示例:

class myClass: NSTimer{
    func printFrom1To1000() {
        for counter in 0...1000 {
            var b = counter
        }
    }
}

let myClassInstance = myClass()

var timer = NSTimer.scheduledTimerWithTimeInterval(0,
    target: myClassInstance,
    selector: Selector("printFrom1To1000"),
    userInfo: nil,
    repeats: false
)
timer.fire()

0
投票

如果您已经有要引用的对象(即更新标签),则可以扩展该类型并将该功能用作选择器。我发现这比创建一个全新的类并从中实例化一个新的对象要容易。

extension SKLabelNode {
    func updateMe() {
    count++
    label.text = "\(count)"
    }
}

var timer = NSTimer.scheduledTimerWithTimeInterval(0.25,
    target: label,
    selector: Selector("updateMe"),
    userInfo: nil,
    repeats: true)
timer.fire()

0
投票

这些解决方案可能在过去的几年中一直有效。它们在Xcode 11.3中绝对不起作用。我不认为可以在操场上运行计时器。您必须使用模拟器。

© www.soinside.com 2019 - 2024. All rights reserved.