在Swift Playground中的NSTimer.scheduledTimerWithTimeInterval
问题描述:
我在Swift中使用“target:self”参数使用“NSTimer.scheduledTimerWithTimeInterval”的所有示例,但不幸的是,这在Swift Playgrounds中无法直接使用。在Swift Playground中的NSTimer.scheduledTimerWithTimeInterval
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()
答
为了得到这个直接迅捷的游乐场内运行,你需要在类中嵌入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()
在我的情况下,我必须每隔5分钟打一次webservice。使用这段代码是否是好的选择? – 2016-03-29 12:02:51