GCD计时器永远不会触发

时间:2012-11-17 05:38:12

标签: objective-c ios cocoa-touch grand-central-dispatch

我在视图的-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

2 个答案:

答案 0 :(得分:5)

所以,问题是当周围的范围被破坏时,我失去了对timer的引用。将timer更改为ivar而不是自动变量固定的东西...

答案 1 :(得分:4)

根据dispatch_source_create的文档:

  

调度源是在挂起状态下创建的。创建之后   源和设置任何所需的属性(例如,处理程序或   上下文),您的应用程序必须调用dispatch_resume才能开始   事件传递。

所以你的计时器永远不会被激活,因为它被暂停了。要结束暂停,您需要致电dispatch_resume