问题描述
我正在尝试使用Swift和GCD做一个不错的计时器.我在Matt Neuburg的书中发现了很多博客,甚至条目.我使用后者将自己的变体放在操场上:
I'm trying to make a nice timer using Swift and GCD. I find lots of blogs and even an entry in Matt Neuburg's book. I used the latter to put together my own variant in a playground:
import Foundation
struct Timer {
private var queue = dispatch_queue_create("timer", nil)
private var source: dispatch_source_t
var tick:()->() = {} {
didSet {
self.update()
}
}
var rate:Double = 1.0 {
didSet {
self.update()
}
}
init() {
self.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.queue)
self.update()
}
func cancel() {
dispatch_source_cancel(self.source)
}
func update() {
dispatch_source_set_timer(self.source, DISPATCH_TIME_NOW, UInt64(Double(NSEC_PER_SEC) / self.rate), 0)
dispatch_source_set_event_handler(self.source, self.tick)
}
func resume() {
dispatch_resume(self.source)
}
}
var timer = Timer()
timer.tick = {
let now = NSDate()
print("\(now)")
}
timer.cancel()
timer.resume()
我没有编译错误.但是操场底部的控制台什么也没显示.如果我添加
I have no compilation errors. But the console at the bottom of the playground shows nothing. If I add
timer.tick()
它输出当前日期的结果,显然执行一次滴答功能.我在他的书中非常接近马特(Matt)的榜样(出于教育目的进行了一些小的更改).所以我不知道是否
It outputs the result of the current date, apparently executing tick function once. I followed Matt's example in his book pretty closely (making small changes for education purposes). So I'm left with not knowing if
A)很好,当我将其移至真实代码时也可以正常工作,只是在Playground输出中看不到任何明显的地方B)某些东西不丢失,而且不是真的发射
A) It's just fine and will work fine when I move it to real code, it just doesn't show anywhere apparent in the Playground outputB) Somethings not missing and it's not really firing
推荐答案
一旦源被dispatch_source_cancel
取消,它将不再调用其事件处理程序.取消dispatch_resume
后,您将无法重新启用该源.您必须创建一个新源.
Once a source has been cancelled by dispatch_source_cancel
, it will never call its event handler again. You cannot reenable the source with dispatch_resume
after cancelling it; you must create a new source.
要使游乐场正常工作,必须删除对timer.cancel()
的呼叫.
To make your playground work, you must remove the call to timer.cancel()
.
此外,在执行了整个Playground脚本之后,默认情况下会退出Playground进程.如果希望它继续运行,则需要设置XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
.
Furthermore, after the entire playground script has been executed, the playground process exits by default. If you want it to keep running, you need to set XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
.
因此,使脚本结尾看起来像这样:
So make the end of your script look like this:
var timer = Timer()
timer.tick = {
let now = NSDate()
print("\(now)")
}
timer.resume()
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
这篇关于无法在Swift中让我的计时器在Playground中触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!