为什么这个调度不起作用?

Why does this dispatch not work?

我正在尝试使用带有 GCD 的计时器。除了 viewDidLoad:

之外,应用程序没有任何内容
    import UIKit

    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()

            let delay = 2
            let q = dispatch_queue_create("dispatchQ", DISPATCH_QUEUE_SERIAL)
            let timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, q)
            print("timerSource created")

            dispatch_source_set_timer(timerSource, DISPATCH_TIME_NOW,
                UInt64(delay) * UInt64(NSEC_PER_SEC),
                UInt64(0.5 * Double(NSEC_PER_SEC)))
            print("timerSource time set")

            dispatch_source_set_event_handler(timerSource, { print("tick") })
            print("timerSource event set")

            dispatch_resume(timerSource)
            print("timerSource resumed")
        } 
}

我希望 "tick" 每 2 秒在调试面板中打印一次,但没有任何反应。这是完整的输出:

timerSource created
timerSource time set
timerSource event set
timerSource resumed

有人能说说为什么它不滴答吗?

我认为没有任何事情发生,因为 'timerSource' 在 vi​​ewDidLoad 结束时未分配。当我将其设为全球时,它会按预期工作。由于 timerSource 的声明引用了 q,q 也必须是全局的。

另一个星期是因为调度时间是 DISPATCH_TIME_NOW 第一个滴答立即发生,这是我不想要的,所以我必须在第一时间走捷径(感谢马特)。

所以 ViewController 看起来像这样:

import UIKit

let q = dispatch_queue_create("dispatchQ", DISPATCH_QUEUE_SERIAL)
let timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, q)

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let delay = 3
        var firstTime = true

        dispatch_source_set_timer(timerSource, DISPATCH_TIME_NOW,
            UInt64(delay) * UInt64(NSEC_PER_SEC),
            UInt64(0.5 * Double(NSEC_PER_SEC)))
        print("timerSource time set")

        dispatch_source_set_event_handler(timerSource)
            {
                if firstTime {
                    firstTime = false
                    return
                }
                print("tick")
            }
        print("timerSource event set")

        dispatch_resume(timerSource)
        print("timerSource resumed")
    }
}