我在视图的-viewDidLoad
中有一个简单的单视图iOS应用程序,其中包含以下内容:
dispatch_queue_t q_default;
q_default = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, q_default); //run event handler on the default global queue
dispatch_time_t now = dispatch_walltime(DISPATCH_TIME_NOW, 0);
dispatch_source_set_timer(timer, now, 30ull*NSEC_PER_SEC, 5000ull);
dispatch_source_set_event_handler(timer, ^{
printf("test\n");
});
dispatch_resume(timer);
这是直接从文档中获取的(简化的printf()
参数除外)。该块永远不会被执行 - 有人可以告诉我为什么吗?
其他信息
我在一个更大的应用程序中尝试这个无济于事。然后我退回到准系统应用程序,尝试使用ARC打开和关闭,在-appDidFinishLaunching...
中尝试此代码,一切都没有运气。我可以使用NSLog
s来包围此代码,两者都打印出来。我检查了timer
- 它不是nil
。
答案 0 :(得分:5)
所以,问题是当周围的范围被破坏时,我失去了对timer
的引用。将timer
更改为ivar而不是自动变量固定的东西...
答案 1 :(得分:4)
根据dispatch_source_create的文档:
调度源是在挂起状态下创建的。创建之后 源和设置任何所需的属性(例如,处理程序或 上下文),您的应用程序必须调用dispatch_resume才能开始 事件传递。
所以你的计时器永远不会被激活,因为它被暂停了。要结束暂停,您需要致电dispatch_resume。