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