![](/img/trans.png)
[英]Using NSTimer.scheduledTimerWithTimeInterval in Swift 2
[英]NSTimer.scheduledTimerWithTimeInterval in Swift Playground
我在 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()
这些天你真的不应该使用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()
要使其直接在 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()
如果您已经有一个正在引用的对象(即更新标签),您可以扩展该类型并将该函数用作选择器。 我发现这比创建一个全新的类并从中实例化一个新对象更容易。
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.