为什么这个调度不起作用?
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' 在 viewDidLoad 结束时未分配。当我将其设为全球时,它会按预期工作。由于 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")
}
}
我正在尝试使用带有 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' 在 viewDidLoad 结束时未分配。当我将其设为全球时,它会按预期工作。由于 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")
}
}