Swift Playground 中的 NSTimer.scheduledTimerWithTimeInterval

Posted

技术标签:

【中文标题】Swift Playground 中的 NSTimer.scheduledTimerWithTimeInterval【英文标题】:NSTimer.scheduledTimerWithTimeInterval in Swift Playground 【发布时间】:2014-12-03 02:33:34 【问题描述】:

我在 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()

【问题讨论】:

【参考方案1】:

这些天你真的不应该使用NSTimer。它会消耗大量资源,导致不必要的电池消耗,而且 API 本身会产生丑陋的代码。

改用dispatch_after()

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

当然,由于计时器会在 Playground 完成后触发,因此您需要一个等效的 timer.fire() 来强制代码立即执行,而不是在 0 秒延迟后执行。以下是它的工作原理:

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


dispatch_after(0, dispatch_get_main_queue(), printFrom1To1000)

printFrom1To1000()

【讨论】:

就我而言,我必须每 5 分钟访问一次网络服务。使用此代码会是一个不错的选择吗?【参考方案2】:

要让它直接在 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()

【讨论】:

【参考方案3】:

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

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()

【讨论】:

以上是关于Swift Playground 中的 NSTimer.scheduledTimerWithTimeInterval的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 3 Playground 读取 Resources 目录中的文本文件?

在 Playground 中的 swift 3 中添加延迟似乎不准确

Swift Playground 中的 NSTimer.scheduledTimerWithTimeInterval

Swift Playground 4:导入 Swift 包

Swift Playground 中的 CABasicAnimation

Swift Playground 中的 SceneKit 粒子系统