我試圖用Swift和GCD製作一個不錯的計時器。我發現很多博客,甚至還有馬特紐伯格的書中的一個條目。我用後者把我自己的變體放在一個操場上:無法讓我的計時器在Swift中在操場上觸發
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()
我沒有編譯錯誤。但操場底部的控制檯什麼也沒有顯示。如果我加
timer.tick()
它輸出當前日期的結果,顯然執行一次滴答函數。我在他的書中非常仔細地跟蹤了馬特的例子(爲了教育目的做了一些小改動)。所以我不知道是否
A)它很好,當我將它移動到真正的代碼時它會正常工作,它只是不顯示任何明顯的Playground輸出 B)Somethings不會丟失,它是沒有真正開火