在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() 
+0

在我的情况下,我必须每隔5分钟打一次webservice。使用这段代码是否是好的选择? – 2016-03-29 12:02:51

为了得到这个直接迅捷的游乐场内运行,你需要在类中嵌入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()