5

我有一个裸单视图 iOS 应用程序,在-viewDidLoad视图中包含以下内容:

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...,但都没有运气。我可以用 s 包围这段代码NSLog,这两个都被打印出来了。我查过了timer——不是nil

4

2 回答 2

5

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

于 2012-12-14T14:26:24.867 回答
4

根据dispatch_source_create的文档:

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

所以你的计时器永远不会因为它被暂停而触发。要结束其暂停,您需要调用dispatch_resume

于 2012-11-17T07:17:41.050 回答