我希望能够安排在将来的绝对或相对时间运行闭包。我看到我可以使用NSTimer
来安排稍后调用的选择器,但这不是我想要的。我更愿意看到这样的事情:
let timer = NSTimer.scheduleWithTimeInterval(
ti: NSTimerInterval(1.0),
action: {
// do something
}
)
在Swift中有没有内置的方法可以做这样的事情?
我现在遇到dispatch_after
这似乎更符合我的想法,但我对其他想法持开放态度。
答案 0 :(得分:4)
dispatch_after
应该是一个很好的解决方案,因为没有基于块的NSTimer方法。
或者你可以使用(或创建)一个简单的基于块的NSTimer类别(或Swift中的扩展):https://github.com/jivadevoe/NSTimer-Blocks
答案 1 :(得分:4)
我一直在找同样的事情。我在this Github Gist找到了Nate Cook,这是一个NSTimer
扩展程序,允许您传入一个闭包。从该Gist复制以下代码并删除注释。请参阅上面的链接以获取完整版和/或更新版。
extension NSTimer {
class func schedule(delay delay: NSTimeInterval, handler: NSTimer! -> Void) -> NSTimer {
let fireDate = delay + CFAbsoluteTimeGetCurrent()
let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, 0, 0, 0, handler)
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
return timer
}
class func schedule(repeatInterval interval: NSTimeInterval, handler: NSTimer! -> Void) -> NSTimer {
let fireDate = interval + CFAbsoluteTimeGetCurrent()
let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, interval, 0, 0, handler)
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
return timer
}
}
第一个功能允许您安排延迟事件。第二个允许您安排重复的事件。
<强>用法:强>
var count = 0
NSTimer.schedule(repeatInterval: 1) { timer in
count += 1
print(count)
if count >= 10 {
timer.invalidate()
}
}
NSTimer.schedule(delay: 5) { timer in
print("5 seconds")
}
(我修改了原来的print(++count)
行,因为现在已弃用++
。)