【问题标题】:NSTimer.scheduledTimerWithTimeInterval in Swift PlaygroundSwift Playground 中的 NSTimer.scheduledTimerWithTimeInterval
【发布时间】: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()

【问题讨论】:

    标签: swift nstimer swift-playground


    【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多