一个简单的基于 GCD 的 Swift 定时器
既然我们已经有 NSTimer
,为什么还需要新的定时器?
NSTimer
是一个 Objective-C 类,需要调用 @selector
。在 Swift 中,我们没有选择器,我们必须传递一个包含要调用的函数名称的 String
,类似于下面这样
let timer = NSTimer(timeInterval: 0.5, target: self, selector: "myfunction", userInfo: nil, repeats: false)
哎呀!
问题在于,“myfunction”字符串将在运行时进行评估。这意味着如果我们输入了函数名称的拼写错误,编译器将无法通知我们代码将不会执行。
如果没有办法向定时器传递一个闭包该多好?
使用 PDKTimer
非常简单。只需调用
let timer = PDKTimer(timeInterval: 5.0, repeats: true){
// do something
}
并且这个闭包将每 5 秒执行一次
PDKTimer
实例不自动调度。您必须手动调用 schedule
才能启动。
let timer = PDKTimer(timeInterval: 5.0, repeats: true){
// do something
}
timer.schedule()
PDKTimer
是使用 GCD API 实现的。它不是使用内部 NSTimer
的 Swift 包装器。这允许在后台队列中执行定时器,还可以在特定的 dispatch queue
上分派定时闭包。只需使用以下方式创建您的定时器
let dispatchQueue = dispatch_queue_create("com.produkt.pdktimer.test", DISPATCH_QUEUE_SERIAL)
PDKTimer(timeInterval: 0.5, repeats: false, dispatchQueue: dispatchQueue){
// do something
}
然后您的闭包将在您的自定义队列上执行
我真的很喜欢 SwiftyTimer API,它是 radex 提供的,这是对 NSTimer
的 Swift 包装器。因此,我采用了他建议的 API。
您可以使用 PDKTimer.every
和 PDKTimer.after
快捷初始化器创建重复和一次性定时器
PDKTimer.every(5.seconds){
// executes every 5 seconds
}
PDKTimer.after(5.seconds){
// waits 5 seconds and then executes once
}
还定义了一个 Double 扩展,您可以使用类似 Ruby-on-Rails 辅助工具定义时间间隔
500.milliseconds
1.second
2.5.seconds
5.seconds
10.minutes
1.hour
PDKTimer
简写初始化器会自动安排。所以你不需要手动调用安排。
PDKTimer.every(5.seconds){
}
// no scheduling needed
丹尼尔·加西亚
https://github.com/fillito https://github.com/Produkt
感谢 Javi Soto 为编写 MSWeakTimer 做的贡献。这帮助我很好地理解了一些GCD API来实现计时器。
感谢 Radek Pietruszewski 为设计 SwiftyTimer API所做的贡献,我从那里借鉴了很多。